[英]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
。 请注意,它可能是-bash
或bash
,具体取决于它是否是登录 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.