Ich beobachte ein merkwürdiges Verhalten, wenn ich die PID bestimmter Shells untersuche, wenn diese in einem nicht interpretierten Kontext ausgeführt werden.
In den folgenden Beispielen sehe ich, dass die PID wie erwartet auf die Shell zeigt.
sh-4.3$ echo 'readlink /proc/$$/exe' | /bin/bash
/bin/bash
sh-4.3$ echo 'readlink /proc/$$/exe' | /bin/tcsh
/bin/tcsh
sh-4.3$ echo 'readlink /proc/$$/exe' | /bin/zsh
/usr/bin/zsh
Wenn ich jedoch dieselbe Idee mit -c
anstelle einer Pipe ausprobiere, lautet die PID in Bourne-kompatiblen Shells „for“ readlink
anstelle der Shell.
sh-4.3$ /bin/tcsh -c 'readlink /proc/$$/exe'
/bin/tcsh
sh-4.3$ /bin/bash -c 'readlink /proc/$$/exe'
/usr/bin/readlink
sh-4.3$ /bin/zsh -c 'readlink /proc/$$/exe'
/usr/bin/readlink
Ich habe auch festgestellt, dass ich meistens die erwarteten Ergebnisse erhalte, wenn ich den Befehl als zusammengesetzte Anweisung statt als einzelne Anweisung verfasse ( zsh
scheint etwas hartnäckiger zu sein).
sh-4.3$ /bin/bash -cf 'readlink /proc/$$/exe | cat'
/bin/bash
sh-4.3$ /bin/zsh -cf 'readlink /proc/$$/exe | cat'
/usr/bin/zsh
sh-4.3$ /bin/bash -cf 'readlink /proc/$$/exe; :'
/bin/bash
sh-4.3$ /bin/zsh -cf 'readlink /proc/$$/exe; :'
/bin/zsh
sh-4.3$ /bin/bash -cf ':; readlink /proc/$$/exe'
/bin/bash
sh-4.3$ /bin/zsh -cf ':; readlink /proc/$$/exe'
/usr/bin/readlink
sh-4.3$ /bin/bash -c 'readlink /proc/$$/exe > /dev/stdout'
/bin/bash
sh-4.3$ /bin/zsh -c 'readlink /proc/$$/exe > /dev/stdout'
/usr/bin/readlink
Ich vermute, dass die Bourne-kompatiblen Shells prüfen, ob der Aufruf als einzelne Anweisung ausgeführt werden kann, und wenn ja, verwenden sieexecv
oder so ähnlich, anstatt die Shell tatsächlich aufzurufen.
Meine Fragen:
- Ist mein Verdacht richtig? Wenn ja, was könnten die Motive dafür gewesen sein?
- Kann ich dieses Verhalten deaktivieren?