Comportamiento inesperado al consultar el PID de bash o zsh cuando se usa el indicador --command/-c

Comportamiento inesperado al consultar el PID de bash o zsh cuando se usa el indicador --command/-c

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 -cen lugar de una tubería, el PID en shells compatibles con Bourne es en readlinklugar 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 ( zshparece 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í, usandoexecvo 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?

información relacionada