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 -c
em vez de um pipe, o PID em shells compatíveis com Bourne será usado readlink
em 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 ( zsh
parece 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, usandoexecv
ou 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?