我正在尝试显示 Conkys 进程的正常运行时间。如果我在终端中逐行输入以下内容,一切都会正常,我就会得到我想要的结果。
getPID=$(pgrep -f conky)
conkyPID=$(ps -p $getPID -o etime=)
echo $conkyPID
天真的我以为 Bash 脚本会是这样的。
#!/bin/bash
getPID=$(pgrep -f conky)
conkyPID=$(ps -p "$getPID" -o etime=)
echo "$conkyPID"
我问过几个朋友,他们给我的最有用的信息是我需要一个命令行分隔符,我认为它是一个|
。我尝试了很多种括号、引号和竖线,但都无济于事。在我的实验中,似乎第二行不知道我在上一行设置了变量“getPID”。当我运行脚本时,我得到了。
error: process ID list syntax error
运行脚本的输出bash -x
:
ricky@Shitmobile:~$ bash -x conkypid.sh
++ pgrep -f conky
+ getPID='45990
153098'
++ ps -p '45990 153098' -o etime=
error: process ID list syntax error
答案1
在您的情况下,由于每一行都是一个单独的命令,所以没有任何区别 - 脚本应该可以工作:(请注意$getPID
并且$conkyPID
应该被引用)
#!/bin/bash
getPID=$(pgrep -f conky)
conkyPID=$(ps -p "$getPID" -o etime=)
echo "$conkyPID"
我已经测试过了,这对我来说效果很好。
但是,由于pgrep
可以返回多个值作为输出(在您的例子中确实如此),因此您应该隔离输出,以便仅获取最早的 PID。因此请像这样修改:
#!/bin/bash
getPID=$(pgrep -fo conky)
# getPID=$(pgrep -f conky | head -n 1) # another, but not as elegant method
conkyPID=$(ps -p "$getPID" -o etime=)
echo "$conkyPID"
这将仅获取 conky 的第一个 PID,并显示该 PID 的经过时间。
另一方面,如果您希望处理可能由输出的所有 PID pgrep
,那么您可以将输出通过管道传输到,xargs
如下ps
所示:
pgrep -f conky | xargs -I _ ps -p _ -o etime=
其中两者都只-I _
处理一个参数行(pgrep
默认在新行上输出每个 PID)并将其传递给ps -p _ ...
占位符的位置_
。...您还可以使用命令替换直接将值分配给变量,甚至可以缩短脚本,如下所示:
conkyPID=$(pgrep -f conky | xargs -I _ ps -p _ -o etime=)
echo "$conkyPID"