--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あるいは、実際にシェルを呼び出すのではなく、同様のものです。

私の質問:

  • 私の疑いは正しいですか?それでは、その動機は何ですか?
  • この動作を無効にできますか?

ベストアンサー1

おすすめ記事