Prozess-ID von $! kann in Bash 3.2.57 nicht erfasst werden

Prozess-ID von $! kann in Bash 3.2.57 nicht erfasst werden

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 bashschon 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 !foozu 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.)

verwandte Informationen