--command/-c 플래그를 사용하여 PID에 대해 bash 또는 zsh를 쿼리할 때 예기치 않은 동작

--command/-c 플래그를 사용하여 PID에 대해 bash 또는 zsh를 쿼리할 때 예기치 않은 동작

해석되지 않은 컨텍스트에서 실행할 때 특정 쉘의 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그러나 파이프 대신 동일한 아이디어를 시도하면 Bourne 호환 쉘의 PID가 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또는 실제로 쉘을 호출하는 대신 유사한 것입니다.

내 질문:

  • 내 의심이 맞나요? 그렇다면 그 동기는 무엇일까요?
  • 이 동작을 비활성화할 수 있나요?

관련 정보