Hat der Shellshock-Bash-Fix grundlegende Befehlszeilentools wie Echo und Cat beschädigt?

Hat der Shellshock-Bash-Fix grundlegende Befehlszeilentools wie Echo und Cat beschädigt?

Früher konnte ich Dinge tun wie:

X=123 cat <<EOF
X is $X
EOF

oder noch einfacher:

X=123 echo $X

Das erste scheint nach der Installation des Bash-Fixes unter Mac OS X noch zu funktionieren, aber beide scheinen auf meiner Ubuntu 14.04-Instanz in AWS nicht mehr zu funktionieren. Was führt dazu, dass ich auf diese Umgebungsvariablen echokeinen catZugriff mehr habe? Noch seltsamer ist, dass ich keine Probleme zu haben scheine, wenn ich die Umgebungsvariablen an eine NodeJS-App übergebe:

cat <<EOF > test.js
console.log('X is ' + process.env.X);
EOF
X=123 node test.js

Dies scheint auch in Bash-Skripten zu funktionieren:

cat <<EOF > test.sh
echo X is \$X
EOF
chmod +x test.sh
X=123 ./test.sh

Antwort1

Wenn Sie in einer POSIX-Shell schreiben

X=123 echo $X

wird $Xerweitert, bevor der gesamte Befehl ausgeführt wird, d. h. wenn $Xzunächst nicht gesetzt ist, erhalten Sie:

X=123 echo

welches dann ausgeführt wird. Sie können mehr oder weniger sehen, was die Shell mit macht set -x:

$ set -x
$ X=123 echo X=$X
+ X=123
+ echo X=
X=
$ set +x

Sie können sehen, dass echo(eigentlich die Shell selbst, die die Erweiterung vor der Ausführung durchführt echo) immer noch Zugriff auf die Umgebung hat:

$ X=123 eval 'echo $X'
123

Das Problem mit cat <<EOFist ähnlich. Beachten Sie bash, dass es in Bezug auf einen Fehler in alten Versionen (vor 4.1) gab, der in der CHANGESDatei wie folgt beschrieben wird:

Ein Fehler wurde behoben, der dazu führte, dass die Variablenerweiterung in Here-Dokumenten in jeder temporären Umgebung suchte.

Dies kann die Ursache für das unter Mac OS X beobachtete Verhalten sein. Verlassen Sie sich nicht auf diesen Fehler.

Antwort2

Ihre Fragen zu den Here-Dokumenten haben wahrscheinlich nichts damit zu tun. Die Sache ist, dass bashdie Erweiterungen und die Zuweisung gleichzeitig durchgeführt werden – eine führende Angabe X=123...sollte also den aus dem Here-Dokument erweiterten Wert nicht beeinflussen. Dies liegt daran, dass das Here-Dokument ein Eingabedateideskriptor ist, der beim Aufruf auf dieselbe Weise basherstellt und übergeben werden muss, wie er zugewiesen werden muss , bevor er diesen und den Rest seiner Umgebung zu einem bestimmten Zeitpunkt übergibt.cat123$Xcatexecve

Halten:

X=321; X=123 bash <<HEREDOC
echo "$X is not yet \$X and $$ is not yet \$$."
HEREDOC

AUSGABE

321 is not yet 123 and 17134 is not yet 17225.

verwandte Informationen