使用 --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。

我的问题:

  • 我的怀疑正确吗?如果是这样,这样做的动机可能是什么?
  • 我可以禁用此行为吗?

相关内容