it-swarm-eu.dev

Was bedeutet $$ in der Schale?

Ich habe einmal gelesen, dass eine Möglichkeit, einen eindeutigen Dateinamen in einer Shell für temporäre Dateien zu erhalten, die Verwendung eines doppelten Dollarzeichens ($$) ist. Dies erzeugt eine von Zeit zu Zeit unterschiedliche Nummer. Wenn Sie sie jedoch wiederholt anrufen, wird dieselbe Nummer zurückgegeben. (Die Lösung ist, nur die Zeit zu nutzen.)

Ich bin neugierig zu wissen, was $$ eigentlich ist und warum dies als Möglichkeit zur Erzeugung eindeutiger Dateinamen vorgeschlagen werden sollte.

125
Kitty

In Bash $$ ist die Prozess-ID. Wie in den Kommentaren angegeben, kann sie aus verschiedenen Gründen nicht als temporärer Dateiname verwendet werden.

Verwenden Sie für temporäre Dateinamen den Befehl mktemp.

85
Joe Skora

$$ ist die Prozess-ID (PID) in der Bash. Die Verwendung von $$ ist eine schlechte Idee, da in der Regel eine Race-Bedingung erstellt wird und Ihr Shell-Skript von einem Angreifer unterlaufen werden kann. Siehe zum Beispiel alle diese Personen , die unsichere temporäre Dateien erstellt haben und Sicherheitshinweise erstellen mussten.

Verwenden Sie stattdessen mktemp. Die Linux-Manpage für mktemp ist ausgezeichnet. Hier ist ein Beispielcode davon:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
102
emk

$$ ist die ID des aktuellen Prozesses.

17
Flint

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, die das Skript ausführt.

Dies ist sehr viel kein eindeutiger Bezeichner in dem Sinne, dass er niemals wiederverwendet wird (in der Tat werden PIDs ständig wiederverwendet). Was es Ihnen gibt, ist eine Zahl, die, wenn eine andere Person Ihr Skript ausführt, eine andere Kennung erhält, während Ihre noch ausgeführt wird. Sobald Ihre gestorben ist, wird die PID möglicherweise wiederverwendet, und eine andere Person führt möglicherweise Ihr Skript aus, ruft dieselbe PID ab und erhält daher denselben Dateinamen.

Als solches ist es nur vernünftig zu sagen, "$$ gibt einen Dateinamen so an, dass, wenn jemand anderes dasselbe Skript ausführt, obwohl meine Instanz noch ausgeführt wird, er einen anderen Namen erhält".

6
Adam Wright

$$ ist Ihre PID. Es erzeugt nicht wirklich einen eindeutigen Dateinamen, es sei denn, Sie sind vorsichtig und niemand macht es genauso. 

Normalerweise erstellen Sie etwas wie/tmp/meinProgrammname $$

Es gibt so viele Möglichkeiten, dies zu unterbinden, und wenn Sie an Orten schreiben, an die andere Benutzer schreiben können, ist es für viele Betriebssysteme nicht allzu schwierig, die PID-Werte vorherzusagen, die Sie benötigen, und sich verstellen Als root erstelle ich/tmp/yourprogname13395 als Symlink, der auf/etc/passwd zeigt - und Sie schreiben hinein.

Dies ist eine schlechte Sache in einem Shell-Skript. Wenn Sie eine temporäre Datei für etwas verwenden, sollten Sie eine bessere Sprache verwenden, in der Sie mindestens das "exklusive" Flag zum Öffnen (Erstellen) der Datei hinzufügen können. Dann können Sie sicher sein, dass Sie nichts anderes verschlingen.

4
JBB

Lassen Sie mich die zweite Antwort von emk anstellen - verwenden Sie $$ nicht als etwas "einzigartiges". Verwenden Sie für Dateien mktemp. Für andere IDs innerhalb desselben Bash-Skripts verwenden Sie "$$$ (Datum +% s% N)", um eine angemessene gute Chance der Eindeutigkeit zu erhalten.

 -k
2
Kevin Little

$$ ist die PID des aktuellen Shell-Prozesses. Es ist keine gute Möglichkeit, eindeutige Dateinamen zu generieren.

2
leif

Das $$ ist die Prozess-ID der Shell, in der Ihr Skript ausgeführt wird. Weitere Informationen finden Sie auf der Manpage zu sh oder bash. Die Manpages können entweder über die Befehlszeile "man sh" oder über das Web nach "Shell manpage" gesucht werden

2
Shannon Nelson

Es ist die Prozess-ID des Bash-Prozesses. Keine gleichzeitigen Prozesse haben dieselbe PID.

1
Chris

$$ ist die PID (Prozess-ID) des Shell-Interpreters, der Ihr Skript ausführt. Es ist für jeden Prozess, der derzeit auf einem System ausgeführt wird, anders, aber im Laufe der Zeit wird die PID umbrochen, und nach dem Beenden gibt es einen anderen Prozess mit derselben PID. Solange Sie ausgeführt werden, ist die PID für Sie einzigartig.

Aus der obigen Definition sollte klar sein, dass egal wie oft Sie $$ in einem Skript verwenden, dieselbe Nummer zurückgegeben wird. 

Sie können z. /tmp/myscript.scratch.$$ als temporäre Datei für Dinge, die nicht besonders zuverlässig oder sicher sein müssen. Es empfiehlt sich, solche temporären Dateien am Ende Ihres Skripts zu löschen, indem Sie beispielsweise den Befehl trap verwenden:

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
1
Arkadiy

Sie können den Login-Benutzernamen auch über diesen Befehl abrufen. Z.B.

echo $(</proc/$$/login id). After that, you need to use getent command.
0
Obivan