我不确定如何通过bash将命令的输出保存到变量中:
PID = 'ps -ef | grep -v color=auto | grep raspivid | awk '{print $2}''
我是否必须为撇号或管道使用特殊字符?
谢谢!
答案 0 :(得分:1)
要在shell中捕获命令的输出,请使用命令替换:$(...)
。因此:
pid=$(ps -ef | grep -v color=auto | grep raspivid | awk '{print $2}')
在shell中进行赋值时,等号周围不能有空格。
在为本地使用定义shell变量时,最好使用小写或混合大小写。对系统重要的变量以大写形式定义,您不希望意外覆盖其中一个变量。
如果目标是获取raspivid
流程的PID,那么grep
和awk
可以合并为一个流程:
pid=$(ps -ef | awk '/[r]aspivid/{print $2}')
请注意从输出中排除当前流程的简单技巧:我们搜索raspivid
而不是搜索[r]aspivid
。字符串[r]aspivid
与正则表达式[r]aspivid
不匹配。因此,当前进程将从输出中删除。
awk
为了展示awk
如何替换对grep
的多次调用,请考虑以下情况:假设我们要查找包含raspivid
但未包含的行包含color=auto
。使用awk
,两个条件都可以逻辑组合:
pid=$(ps -ef | awk '/raspivid/ && !/color=auto/{print $2}')
此处/raspivid/
需要与raspivid
匹配。 &&
符号表示逻辑“和”。正则表达式!
之前的/color=auto/
表示逻辑“不”。因此,/raspivid/ && !/color=auto/
仅匹配包含raspivid
但不包含color=auto
的行。
答案 1 :(得分:0)
更直接的方法:
pid=$(pgrep raspivid)