Ich habe einmal gelesen, dass eine Möglichkeit, einen eindeutigen Dateinamen in einer Shell für temporäre Dateien zu erhalten, darin besteht, ein doppeltes Dollarzeichen ( $$
) zu verwenden. Dies führt zu einer Nummer, die von Zeit zu Zeit variiert. Wenn Sie sie jedoch wiederholt anrufen, wird dieselbe Nummer zurückgegeben. (Die Lösung besteht darin, nur die Zeit zu nutzen.)
Ich bin gespannt, was $$
eigentlich ist und warum dies vorgeschlagen wird, um eindeutige Dateinamen zu generieren.
$$
ist die Prozess-ID (PID) in bash. Die Verwendung$$
ist eine schlechte Idee, da dadurch normalerweise eine Race-Bedingung erstellt wird und Ihr Shell-Skript von einem Angreifer untergraben werden kann. Sehen Sie sich zum Beispiel all diese Personen an , die unsichere temporäre Dateien erstellt haben und Sicherheitshinweise ausgeben mussten.Verwenden Sie stattdessen
mktemp
. Die Linux-Manpage für mktemp ist ausgezeichnet. Hier ist ein Beispielcode daraus:quelle
mktemp
Option-t
ist jetzt veraltet (ich denke wegen Problemen mit dem Zeichen-
). Verwenden Siemktemp ${tempfoo}.XXXXXX
diese Tage . Ich erlaube mir, Ihren Beitrag zu aktualisieren.TMPFILE=$(mktemp)
stattdessen.$$ ist die ID des aktuellen Prozesses.
quelle
Jeder Prozess in einem UNIX-ähnlichen Betriebssystem hat eine (vorübergehend) eindeutige Kennung, die PID. Keine zwei Prozesse, die gleichzeitig ausgeführt werden, können dieselbe PID haben, und $$ bezieht sich auf die PID der Bash-Instanz, auf der das Skript ausgeführt wird.
Dies ist kein eindeutiger Identifikator in dem Sinne, dass er niemals wiederverwendet wird (tatsächlich werden PIDs ständig wiederverwendet). Sie erhalten eine Nummer, mit der eine andere Person, die Ihr Skript ausführt, eine andere Kennung erhält, während Ihre noch ausgeführt wird. Sobald Ihre stirbt, wird die PID möglicherweise recycelt, und jemand anderes führt möglicherweise Ihr Skript aus, erhält dieselbe PID und erhält denselben Dateinamen.
Daher ist es nur wirklich vernünftig zu sagen, dass "$$ einen Dateinamen angibt, sodass jemand anderes, der dasselbe Skript ausführt, während meine Instanz noch ausgeführt wird, einen anderen Namen erhält".
quelle
$$ ist Ihre PID. Es wird nicht wirklich ein eindeutiger Dateiname generiert, es sei denn, Sie sind vorsichtig und niemand anderes tut dies genauso.
Normalerweise erstellen Sie so etwas wie / tmp / myprogramname $$
Es gibt so viele Möglichkeiten, dies zu umgehen, und wenn Sie an Orte schreiben, an die andere Leute schreiben können, ist es für viele Betriebssysteme nicht allzu schwierig, vorherzusagen, welche PID Sie haben und herumdrehen werden - stellen Sie sich vor, Sie laufen als root und ich erstelle / tmp / yourprogname13395 als symlink auf / etc / passwd - und du schreibst hinein.
Dies ist eine schlechte Sache in einem Shell-Skript. Wenn Sie eine temporäre Datei für etwas verwenden möchten, sollten Sie eine bessere Sprache verwenden, mit der Sie zumindest das "exklusive" Flag zum Öffnen (Erstellen) der Datei hinzufügen können. Dann können Sie sicher sein, dass Sie nichts anderes überfallen.
quelle
$$ ist die PID des aktuellen Shell-Prozesses. Es ist keine gute Möglichkeit, eindeutige Dateinamen zu generieren.
quelle
$$ ist die PID (Prozess-ID) des Shell-Interpreters, der Ihr Skript ausführt. Es ist für jeden Prozess, der im Moment auf einem System ausgeführt wird, anders, aber im Laufe der Zeit wird die PID umgangen, und nach dem Beenden wird es irgendwann einen anderen Prozess mit derselben PID geben. Solange Sie ausgeführt werden, ist die PID für Sie eindeutig.
Aus der obigen Definition sollte ersichtlich sein, dass unabhängig davon, wie oft Sie $$ in einem Skript verwenden, dieselbe Zahl zurückgegeben wird.
Sie können z. B. /tmp/myscript.scratch.$$ als temporäre Datei für Dinge verwenden, die nicht besonders zuverlässig oder sicher sein müssen. Es wird empfohlen, solche temporären Dateien am Ende Ihres Skripts zu löschen, indem Sie beispielsweise den Befehl trap verwenden:
quelle
Es ist die Prozess-ID des Bash-Prozesses. Kein gleichzeitiger Prozess wird jemals dieselbe PID haben.
quelle
Das $$ ist die Prozess-ID der Shell, in der Ihr Skript ausgeführt wird. Weitere Informationen finden Sie in der Manpage für sh oder bash. Die Manpages können entweder über eine Befehlszeile "man sh" oder durch Durchsuchen des Webs nach "Shell Manpage" gefunden werden.
quelle
Lassen Sie mich die Antwort von emk als Zweites verwenden - verwenden Sie $$ nicht als "einzigartiges" Objekt. Verwenden Sie für Dateien mktemp. Verwenden Sie für andere IDs innerhalb desselben Bash-Skripts "$$$ (Datum +% s% N)", um eine einigermaßen gute Chance auf Eindeutigkeit zu erhalten.
quelle
quelle