Неожиданное поведение при запросе PID bash или zsh при использовании флага --command/-c

Неожиданное поведение при запросе PID bash или zsh при использовании флага --command/-c

Я наблюдаю странное поведение при проверке 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или что-то в этом роде вместо фактического вызова оболочки.

Мои вопросы:

  • Верны ли мои подозрения? Если да, то что могло послужить мотивом для этого?
  • Могу ли я отключить это поведение?

Связанный контент