我正在尝试获取执行脚本的shell的名称。
为什么
echo $(ps | grep $PPID) | cut -d" " -f4
工作时
echo ps | grep $PPID | cut -d" " -f4
没有?
答案 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
表示:
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
- 这没什么,所以什么都没得到答案 2 :(得分:2)
我认为如果你自己只运行echo ps
,你就会明白为什么管道不起作用了:
$ echo ps
ps
相反,请检查$0
。请注意,它可能是-bash
或bash
,具体取决于它是登录shell 。 (好吧,任何shell - 不只是bash
- 但如果shell是登录shell,则会添加连字符。)
答案 3 :(得分:0)
对于许多用途,最好是我们tr
。例如:
输入:
echo "field1,field2,field3" | tr , \\n
输出:
field1
field2
field3