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

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

해석되지 않은 컨텍스트에서 실행될 때 특정 쉘의 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또는 실제로 쉘을 호출하는 대신에 그런 것입니다.

내 질문:

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

관련 정보