當在非解釋上下文中執行時檢查某些 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 將取代readlink
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
我還發現,如果我將命令設為複合語句而不是單一語句,那麼我會得到大多數時候我期望的結果(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。
我的問題:
- 我的懷疑正確嗎?如果是這樣,這樣做的動機可能是什麼?
- 我可以停用此行為嗎?