Linux 为什么在直接打印代码和存储在变量中后,输出会有所不同

Linux 为什么在直接打印代码和存储在变量中后,输出会有所不同,linux,bash,shell,sh,Linux,Bash,Shell,Sh,当我给 ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}' echo $(ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}') 我得到输出: 32356 32356 32551 当我给 ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}' echo $(ps -aux|grep -w 'bash'|grep -v

当我给

ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}'
echo $(ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}')
我得到输出:

32356 
32356 32551
当我给

ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}'
echo $(ps -aux|grep -w 'bash'|grep -v 'grep'|awk '{print $2}')
我得到输出:

32356 
32356 32551

为什么输出会有差异?

看起来您在寻找当前运行的shell的pid。这是最好的方法

echo $$  # which is a bash special variable

看起来您正在跟踪当前运行的shell的pid。这是最好的方法

echo $$  # which is a bash special variable

发生的事情是,$。。。语法启动子shell。因此,这些括号内的ps命令将找到您当前的shell,您可以使用$$获得它,正如@tink所说的,以及由括号调用的子shell

在文件中使用ps fux和rediction,您可以准确地看到发生了什么:

ps fux | grep -w bash > a
cat a
me  11603  0.1  0.0 114408  3728 pts/1    Ss   13:37   0:00  \_ -bash
me  11955  0.0  0.0 103348   872 pts/1    S+   13:41   0:00      \_ grep -w bash

echo $(ps fux | grep -w bash > b)
cat b
me  11603  0.1  0.0 114408  3728 pts/1    Ss+  13:37   0:00  \_ -bash
me  11981  0.0  0.0 114408  2304 pts/1    S+   13:41   0:00      \_ -bash
me  11983  0.0  0.0 103348   872 pts/1    S+   13:41   0:00          \_ grep -w bash

尽管@tink给了您一个很好的解决方案,但我希望这个答案有助于理解正在发生的事情。

正在发生的事情是,$。。。语法启动子shell。因此,这些括号内的ps命令将找到您当前的shell,您可以使用$$获得它,正如@tink所说的,以及由括号调用的子shell

在文件中使用ps fux和rediction,您可以准确地看到发生了什么:

ps fux | grep -w bash > a
cat a
me  11603  0.1  0.0 114408  3728 pts/1    Ss   13:37   0:00  \_ -bash
me  11955  0.0  0.0 103348   872 pts/1    S+   13:41   0:00      \_ grep -w bash

echo $(ps fux | grep -w bash > b)
cat b
me  11603  0.1  0.0 114408  3728 pts/1    Ss+  13:37   0:00  \_ -bash
me  11981  0.0  0.0 114408  2304 pts/1    S+   13:41   0:00      \_ -bash
me  11983  0.0  0.0 103348   872 pts/1    S+   13:41   0:00          \_ grep -w bash

尽管@tink为您提供了一个很好的解决方案,但我希望这个答案有助于理解正在发生的事情。

很可能您刚刚在某个地方打开了另一个bash终端。ps aux将获取您的所有进程。这不是一种检测bash进程的健壮方法。很可能您刚刚在某处打开了另一个bash终端。ps aux将获取您的所有进程。这不是一种检测bash进程的可靠方法。非常努力tink,我想要的不仅是bash,而且是其他所有进程。因此,澄清一下:您想要所有的PID,但是要从当前shell生成的PID?非常努力tink,我想要的不仅是bash,而且是其他所有进程。所以,澄清一下:除了从当前shell生成的PID之外,您想要所有的PID吗?@AllenJohnson您能举一个您想要的firefox进程的例子吗?如果您提供ps的输出,显示您想要查找pid的流程,则更容易理解您的确切需求。这是对你删除的评论的回答,不确定这个问题是否仍然相关…很好的解释现在我认为任何其他过程都没有问题,在这种情况下,grep不会接受subshell值。唯一的情况是当我想找到bash进程id时。这可以通过他的方法解决。所以没有problem@AllenJohnson你能举一个你想要的firefox进程的例子吗?如果您提供ps的输出,显示您想要查找pid的流程,则更容易理解您的确切需求。这是在回答您删除的评论,不确定问题是否仍然相关…很好的解释现在我认为对于任何其他进程都没有问题,在这种情况下,grep不会接受subshell值。唯一的情况是当我想找到bash进程id时。这可以通过他的方法解决。所以没有问题