关于Linux:当使用管道和撇号时,如何将bash命令的输出捕获到变量中?

How to capture the output of a bash command into a variable when using pipes and apostrophe?

本问题已经有最佳答案,请猛点这里访问。

我不知道如何通过bash将命令的输出保存到变量中:

1
PID = 'ps -ef | grep -v color=auto | grep raspivid | awk '{print $2}''

我必须用一个特殊的字符来表示撇号还是管道?

谢谢!


要捕获shell中命令的输出,请使用命令替换:$(...)。因此:

1
pid=$(ps -ef | grep -v color=auto | grep raspivid | awk '{print $2}')

笔记

  • 在shell中进行赋值时,等号周围不能有空格。

  • 在为本地使用定义外壳变量时,最好使用小写或混合大小写。对系统重要的变量在大写中定义,您不希望意外覆盖其中一个变量。

简化

如果目标是获得raspivid过程的PID,则可以将grepawk组合成单个过程:

1
pid=$(ps -ef | awk '/[r]aspivid/{print $2}')

注意将当前进程从输出中排除的简单技巧:我们不搜索raspivid,而是搜索[r]aspivid。字符串[r]aspivid与正则表达式[r]aspivid不匹配。因此,当前进程从输出中删除。

awk的灵活性

为了演示awk如何替换对grep的多个调用,考虑这个场景:假设我们要查找包含raspivid但不包含color=auto的行。使用awk,这两个条件可以逻辑地组合在一起:

1
pid=$(ps -ef  | awk '/raspivid/ && !/color=auto/{print $2}')

这里,/raspivid/需要与raspivid匹配。&&符号表示逻辑"and"。在regex /color=auto/之前的!表示逻辑上的"not"。因此,/raspivid/ && !/color=auto/只在包含raspivid但不包含color=auto的行上匹配。


更直接的方法:

pid=$(pgrep raspivid)