使用 --command/-c 標誌查詢 bash 或 zsh 的 PID 時出現意外行為

使用 --command/-c 標誌查詢 bash 或 zsh 的 PID 時出現意外行為

當在非解釋上下文中執行時檢查某些 shell 的 PID 時,我觀察到奇怪的行為。

在下面的範例中,我看到 PID 正如預期的那樣指向 shell。

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 相容 shell 中的 PID 將取代readlinkshell。

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 相容的 shell 正在檢查呼叫是否可以作為單一語句執行,如果可以,則使用execv或類似的東西而不是實際呼叫 shell。

我的問題:

  • 我的懷疑正確嗎?如果是這樣,這樣做的動機可能是什麼?
  • 我可以停用此行為嗎?

相關內容