我试图获取执行脚本的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
包含很多空格,这些空格会被echo $(ps | grep $PPID)
压缩掉(因为$(...)
的结果在没有双引号的情况下,会被按空格分成单独的参数,而echo
输出所有参数时用空格分隔)。为解决这个问题,你可以使用tr
来“挤压”重复的空格:
ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
或者你可以坚持最初的选择。 :-)
第一行:
echo $(ps | grep $PPID) | cut -d" " -f4
says:
ps | grep $PPID
in a sub-shellReturn the output - which will be something like this:
3559 pts/1 00:00:00 bash
and then use that output as the first parameter of echo - which, in practice, means just echo the output
cut -d" " -f4
on that - which gives you the command name in this caseecho ps | grep $PPID | cut -d" " -f4
说:
ps
$PPID
在该字符串中进行grep - 这永远不会返回任何内容,因为$PPID
包含数字,所以它永远不会是ps
。 因此,grep什么也不返回cut -d" " -f4
- 由于之前没有输出,因此您将得到空结果我认为如果你仅运行echo ps
,你就会看到为什么你的管道不起作用:
$ echo ps
ps
相反,请检查$0
。请注意,它可能是-bash
或bash
,这取决于它是否为登录shell。(好吧,任何shell——不仅仅是bash
——但如果shell是登录shell,则会添加连字符。)