Observo un comportamiento extraño al examinar el PID de ciertos shells cuando se ejecutan en un contexto no interpretado.
En los ejemplos siguientes, veo que el PID apunta al shell, como se esperaba.
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
Sin embargo, si intento la misma idea usando -c
en lugar de una tubería, el PID en shells compatibles con Bourne es en readlink
lugar del 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
También descubrí que si hago del comando una declaración compuesta en lugar de una sola declaración, obtengo los resultados que espero la mayor parte del tiempo ( zsh
parece ser un poco más terco).
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
Sospecho que lo que está sucediendo es que los shells compatibles con Bourne están verificando si la llamada se puede realizar como una sola declaración y, de ser así, usandoexecv
o algo así en lugar de invocar realmente el shell.
Mis preguntas:
- ¿Es correcta mi sospecha? Si es así, ¿cuál podría haber sido la motivación para esto?
- ¿Puedo desactivar este comportamiento?