Co $$ oznacza w skorupie?

Czytałem kiedyś, że jednym ze sposobów na uzyskanie unikalnej nazwy pliku w powłoce dla plików tymczasowych było użycie znaku podwójnego dolara ($$). To powoduje, że liczba zmienia się od czasu do czasu... ale jeśli dzwonisz wielokrotnie, zwraca ten sam numer. (Rozwiązaniem jest po prostu wykorzystać czas.)

Jestem ciekaw, czym jest $$ i dlaczego sugerowano by to jako sposób generowania unikalnych nazw plików.

Author: Jens, 2008-09-17

11 answers

W Bash $$ jest ID procesu, jak zaznaczono w komentarzach, nie jest bezpiecznie używać jako tymczasowej nazwy pliku z różnych powodów.

W przypadku nazw plików tymczasowych użyj polecenia mktemp.

 75
Author: Joe Skora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-14 11:32:53

$$ jest identyfikatorem procesu (PID) W bash. Używanie $$ jest złym pomysłem, ponieważ zazwyczaj tworzy stan rasy i pozwala na obalenie skryptu powłoki przez atakującego. Zobacz na przykład wszystkie osoby, które tworzyły niebezpieczne pliki tymczasowe i musiały wydawać ostrzeżenia dotyczące bezpieczeństwa.

Zamiast tego użyj mktemp. Strona podręcznika Linuksa dla mktemp jest doskonała. Oto przykładowy kod z niego:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
 97
Author: emk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-10 19:23:19

$ $ jest id bieżącego procesu.

 15
Author: Flint,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:01:48

Każdy proces w UNIKSOPODOBNYM systemie operacyjnym ma (tymczasowo) unikalny identyfikator, PID. Żadne dwa procesy działające w tym samym czasie nie mogą mieć tego samego PID, a $$ odnosi się do PID instancji bash uruchamiającej skrypt.

Jest to w dużej mierze , a nie unikalny identyfikator w tym sensie, że nigdy nie zostanie ponownie użyty (rzeczywiście, PID są ponownie używane stale). To, co daje, to numer taki, że jeśli inna osoba uruchomi Twój skrypt, otrzyma inny identyfikator dopóki twój nadal działa. Gdy twój umrze, PID może zostać poddany recyklingowi i ktoś inny może uruchomić twój skrypt, uzyskać ten sam PID, a więc uzyskać tę samą nazwę pliku.

Jako takie, rozsądne jest tylko powiedzenie "$ $ podaje nazwę pliku tak, że jeśli ktoś inny uruchomi ten sam skrypt, gdy moja instancja nadal działa, otrzyma inną nazwę".

 6
Author: Adam Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:05:09

$$ to Twój PID. Tak naprawdę nie generuje unikalnej nazwy pliku, chyba że jesteś ostrożny i nikt inny nie robi tego dokładnie w ten sam sposób.

Zazwyczaj tworzysz coś w stylu /tmp / myprogramname$$

Jest tak wiele sposobów, aby to złamać, a jeśli piszesz do miejsc, do których inni mogą pisać, nie jest zbyt trudne na wielu systemach operacyjnych przewidzieć, jaki PID będziesz miał i wkręcić -- wyobraź sobie, że działasz jako root i tworzę /tmp/yourprogname13395 jako dowiązanie symboliczne wskazując na /etc / passwd -- i piszesz do niego.

To jest zła rzecz do zrobienia w skrypcie powłoki. Jeśli masz zamiar użyć do czegoś pliku tymczasowego, powinieneś używać lepszego języka, który pozwoli Ci przynajmniej dodać flagę "exclusive" do otwierania (tworzenia) pliku. Wtedy możesz być pewien, że nie trzepoczesz czegoś innego.

 4
Author: JBB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:06:00

$$ jest pid bieżącego procesu powłoki. Nie jest to dobry sposób na generowanie unikalnych nazw plików.

 2
Author: leif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:01:50

$ $ jest identyfikatorem procesu powłoki, w której uruchomiony jest skrypt. Aby uzyskać więcej informacji, zobacz stronę podręcznika sh lub bash. Strony podręcznika można znaleźć za pomocą wiersza poleceń "man sh" lub przeszukując internet w poszukiwaniu "Shell manpage"

 2
Author: Shannon Nelson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:05:11

Pozwól, że druga odpowiedź EMKA -- nie używaj $$ sam w sobie jako" unikalnego " czegokolwiek. W przypadku plików użyj mktemp. Dla innych identyfikatorów w tym samym skrypcie bash, użyj "$$$(date + % s % N) " dla rozsądnie dużej szansy na unikalność.

 -k
 2
Author: Kevin Little,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:29:10

To identyfikator procesu bash. Żadne równoległe procesy nigdy nie będą miały takiego samego PID.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:02:44

$ $ jest pid (ID procesu) interpretera powłoki uruchamiającego skrypt. Jest inaczej dla każdego procesu działającego w danym momencie na systemie, ale z czasem pid zawija się, a po zakończeniu pojawi się inny proces o tym samym pid eventually.As dopóki biegasz, pid jest dla ciebie unikalny.

Z powyższej definicji powinno być oczywiste, że bez względu na to, ile razy użyjesz $$ w skrypcie, zwróci on ten sam numer.

Możesz użyć np. /tmp / myscript.scratch.$$ jako plik tymczasowy dla rzeczy, które nie muszą być bardzo niezawodne lub bezpieczne. Dobrą praktyką jest usuwanie takich plików tymczasowych na końcu skryptu, na przykład za pomocą polecenia trap:

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
 1
Author: Arkadiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:08:20

Możesz również pobrać nazwę Użytkownika za pomocą tego polecenia. Np.

echo $(</proc/$$/login id). After that, you need to use getent command.
 0
Author: Obivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 11:05:54