Comportamento inesperado ao consultar o PID do bash ou zsh ao usar o sinalizador --command/-c

Comportamento inesperado ao consultar o PID do bash ou zsh ao usar o sinalizador --command/-c

Estou observando um comportamento estranho ao examinar o PID de determinados shells quando executados em um contexto não interpretado.

Nos exemplos abaixo, vejo que o PID está apontando para o shell, conforme esperado.

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

No entanto, se eu tentar a mesma ideia usando -cem vez de um pipe, o PID em shells compatíveis com Bourne será usado readlinkem vez do 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

Também descobri que, se eu transformar o comando em uma instrução composta em vez de uma única instrução, obtenho os resultados esperados na maioria das vezes ( zshparece ser um pouco mais teimoso).

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

Suspeito que o que está acontecendo é que os shells compatíveis com Bourne estão verificando se a chamada pode ser executada como uma única instrução e, em caso afirmativo, usandoexecvou algo assim, em vez de realmente invocar o shell.

Minhas perguntas:

  • Minha suspeita está correta? Se sim, qual pode ter sido a motivação para isso?
  • Posso desativar esse comportamento?

informação relacionada