繁体   English   中英

管道输出切割

[英]Piping output to cut

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

为什么

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

工作的同时

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

才不是?

原因是

echo ps

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

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

编辑添加: paxdiablo 指出ps | grep $PPID ps | grep $PPID包含很多空格,这些空格会被echo $(ps | grep $PPID)折叠(因为$(...)的结果,当它不在双引号中时,会被空格拆分为单独的参数,然后echo输出以空格分隔的所有参数)。 为了解决这个问题,您可以使用tr来“挤压”重复的空格:

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

或者你可以坚持你必须开始的事情。 :-)

第一行:

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

说:

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

     3559 pts/1 00:00:00 bash

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

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

第二条命令:

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

说:

  • 回声字符串ps
  • $PPID查找该字符串 - 这将永远不会返回任何内容,因为$PPID包含一个数字,因此它永远不会是ps 因此,grep 不返回任何内容
  • 使用前一个命令的输入执行cut -d" " -f4 - 这没什么,所以你什么也得不到

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

$ echo ps
ps

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

我试图获取执行脚本的外壳的名称。

为什么

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

一边工作

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

才不是?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM