Auf meinem Remote-Server mit Bash 4.2.46 kann ich Folgendes tun:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646
Auf meinem Mac mit Bash 3.2.57 funktioniert es jedoch nicht:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found
Was ist los? Irgendwie benutze ich macOS bash
schon seit Jahren, ohne jemals zuvor auf dieses Problem gestoßen zu sein ... aber ich schwöre, ich habe viele Shell-Programme ausgeführt, die genau diese $!
Methode verwenden, um die Prozess-ID eines Hintergrundprozesses abzurufen, und es ist nie schiefgegangen.
Antwort1
Das !
ist das Auslösezeichen fürGeschichte Erweiterung, in interaktiven Shells standardmäßig aktiviert.
Ich glaube nicht, dass es pid=$!;
in Ihrem Fall oder in irgendetwas Nützliches bewirken würde echo "$!"
. Wie Sie der Fehlermeldung entnehmen können, wird versucht, nach einer leeren Zeichenfolge zu suchen, anstatt nach etwas wie !foo
zu suchen foo
. Neuere Versionen von Bash sind diesbezüglich vernünftiger $!
oder "!"
lösen es nicht aus, aber 3.2 ist diesbezüglich etwas dumm.
Was zu funktionieren scheint, ist pid=$! ;
, mit dem Leerzeichen vor dem Semikolon. Oder Sie können die Verlaufserweiterung einfach mit deaktivieren set +H
. (Beachten Sie, dass"$!"
nichtArbeit in 3.2.)