管道输出减少

时间:2012-02-22 03:17:08

标签: linux bash shell

我正在尝试获取执行脚本的shell的名称。

为什么

echo $(ps | grep $PPID) | cut -d" " -f4

工作时

echo ps | grep $PPID | cut -d" " -f4

没有?

4 个答案:

答案 0 :(得分:19)

原因是

echo ps

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

ps | grep $PPID | cut -d" " -f4

编辑添加: paxdiablo指出ps | grep $PPID包含许多将被echo $(ps | grep $PPID)折叠的空白(因为$(...)的结果,它不是双引号,由空格分成单独的参数,然后echo输出由空格分隔的所有参数)。要解决此问题,您可以使用tr“挤压”重复的空格:

ps | grep $PPID | tr -s ' ' | cut -d' ' -f5

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

答案 1 :(得分:6)

第一行:

echo $(ps | grep $PPID) | cut -d" " -f4

表示:

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

    3559 pts/1 00:00:00 bash
    

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

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

第二个命令:

echo ps | grep $PPID | cut -d" " -f4

表示:

  • 回音字符串ps
  • Grep $PPID的字符串 - 由于$PPID包含一个数字,因此永远不会返回任何内容,因此它永远不会是ps。因此,grep不返回任何内容
  • 使用上一个命令的输入执行cut -d" " -f4 - 这没什么,所以什么都没得到

答案 2 :(得分:2)

我认为如果你自己只运行echo ps,你就会明白为什么管道不起作用了:

$ echo ps
ps

相反,请检查$0。请注意,它可能是-bashbash,具体取决于它是登录shell 。 (好吧,任何shell - 不只是bash - 但如果shell是登录shell,则会添加连字符。)

答案 3 :(得分:0)

对于许多用途,最好是我们tr。例如:

输入: echo "field1,field2,field3" | tr , \\n 输出: field1 field2 field3