管道输出减少

ZPS*_*ZPS 14 linux bash shell

我试图获取执行脚本的shell的名称.

为什么

echo $(ps | grep $PPID) | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

工作的同时

echo ps | grep $PPID | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

才不是?

rua*_*akh 20

原因是

echo ps
Run Code Online (Sandbox Code Playgroud)

只打印出字符串ps; 它不运行程序ps.您的命令的更正版本将是:

ps | grep $PPID | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

编辑添加: paxdiablo指出ps | grep $PPID包括很多将被折叠的空格echo $(ps | grep $PPID)(因为$(...)当它不是双引号时,由空格分成单独的参数,然后echo输出由空格分隔的所有参数).要解决这个问题,您可以使用tr"挤压"重复的空格:

ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
Run Code Online (Sandbox Code Playgroud)

或者你可以坚持你必须开始的东西.:-)


icy*_*com 6

第一行:

echo $(ps | grep $PPID) | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

说:

  • ps | grep $PPID在子shell中执行
  • 返回输出 - 这将是这样的:

    3559 pts/1 00:00:00 bash
    
    Run Code Online (Sandbox Code Playgroud)

    然后使用该输出作为echo的第一个参数 - 实际上,这意味着只回显输出

  • 然后运行cut -d" " -f4- 在这种情况下,它为您提供命令名称

第二个命令:

echo ps | grep $PPID | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

说:

  • 回声串 ps
  • grep那个字符串$PPID- 这将永远不会返回任何东西,因为它$PPID包含一个数字,所以它永远不会ps.因此,grep什么都不返回
  • 执行cut -d" " -f4上一个命令的输入 - 这没什么,所以你什么也得不到