2015-12-22 15 views
5

W wierszu polecenia, mam to:

$ FOO=foo 
$ echo $FOO 
foo 
$ echo $$FOO 
11971FOO 

Tutaj $$ postanawia PID powłoki zgodnie z oczekiwaniami i „foo” jest drukowany dosłownie.

Teraz, starając się zrozumieć i debugowania niektóre skrypty, znaleźć następujące:

#!/bin/bash 
FILE1=/path/to/file/1 
FILE2=/path/to/file/2 
echo $$FILE1 >> $$FILE2 

Skrypt ten pochodzi ze skryptu postinstall pakietu Debiana. Czy ma to zostać poddane wstępnemu przetwarzaniu, zanim będzie można je uruchomić?

Aktualizacja: Skrypt jest częścią pakietu zbudowanego z EPM i odczytywane za pomocą następującej dyrektywy:

%postinstall <script.sh 

w pakietach deb, skrypt postinst brzmi:

#!/bin/bash 
FILE1=/path/to/file/1 
FILE2=/path/to/file/2 
echo $FILE1 >> $FILE2 

Tak więc przetwarzanie jest wykonywane przez epm lub dpkg.

+0

Dla mnie wygląda to na sposób utworzenia katalogu, którego nazwa nie koliduje z żadnym istniejącym. – fedorqui

+1

Jeśli to rzeczywisty skrypt, to prawie na pewno ma być przetwarzane. Nie można jednak powiedzieć na pewno, bez większego kontekstu. – chepner

+1

Er, wstępnie przetworzone. – chepner

Odpowiedz

2

To widocznie cechą narzędzia do pakowania EPM. Cytowanie the documentation:

Zauważ, że wszystkie polecenia określone w pliku listy użyje zmienną ekspansję dostarczonych przez EPM, więc należy przytoczyć żadnych znak dolara ($) znaków w twoich poleceń. Na przykład "$ foo" zostaje zastąpione przez wartość "foo", ale "$$ foo" staje się "$ foo".

0

$$ drukuje ID procesu, który jest 11971 w twoim przypadku.

Skoro masz FOO po tym echo prostu zrzuca FOO po 11971 więc masz

11971FOO 

Aby być precyzyjnym jest to identyfikator procesu powłoki bash w którym uruchomiono sesję. Aby to zweryfikować, możesz:

kill -9 11971 

, która zakończy bieżącą sesję. Poniższy skrypt w normalnych warunkach:

#!/bin/bash 
FILE1=/path/to/file/1 
FILE2=/path/to/file/2 
echo $$FILE1 >> $$FILE2 

nie zostanie poddany żadnemu wstępnemu przetwarzaniu. Będzie ona utrzymać na dołączenie pliku

current_shell_process_id_FILE2 

w bieżącym katalogu z zawartością

current_shell_process_idFILE1 
+10

PO wyjaśnił, że już wie, co' $$ 'oznacza samo. –

+0

@TomFenech: Zaktualizowano moją odpowiedź. – sjsam

+0

@sjsam Dzięki za odpowiedź. Rozumiem to. Zastanawiam się, czy cytowane wiersze robią coś innego w kontekście skryptu poinstalacyjnego. – Jan