Я наблюдаю странное поведение при проверке PID некоторых оболочек, выполняемых в неинтерпретируемом контексте.
В приведенных ниже примерах я вижу, что PID указывает на оболочку, как и ожидалось.
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
Однако если я попробую реализовать ту же идею -c
, используя вместо канала PID в оболочках, совместимых с Bourne, readlink
вместо оболочки.
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
Я также обнаружил, что если я делаю команду составным оператором вместо одного, то в большинстве случаев я получаю ожидаемые результаты ( zsh
кажется, это немного более упрямо).
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
Я подозреваю, что происходит следующее: совместимые с Bourne оболочки проверяют, может ли вызов быть выполнен как один оператор, и если да, то используютexecv
или что-то в этом роде вместо фактического вызова оболочки.
Мои вопросы:
- Верны ли мои подозрения? Если да, то что могло послужить мотивом для этого?
- Могу ли я отключить это поведение?