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

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

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

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

我必须为撇号或竖线使用特殊字符吗?

谢谢!

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

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

备注

  • 在shell中赋值时,等号两边不能有空格。

  • 定义供本地使用的 shell 变量时,最好使用小写或混合大小写。对系统重要的变量以大写形式定义,您不希望不小心覆盖其中之一。

简化

如果目标是获取raspivid进程的PID,那么grepawk可以合并为一个进程:

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

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

awk

的灵活性

为了展示 awk 如何替换对 grep 的多次调用,请考虑以下场景:假设我们要查找包含 raspivid包含color=auto。使用awk,两个条件可以逻辑组合:

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

此处,/raspivid/ 需要与 raspivid 匹配。 && 符号表示逻辑 "and"。正则表达式 /color=auto/ 之前的 ! 表示逻辑 "not"。因此,/raspivid/ && !/color=auto/ 仅匹配包含 raspivid 但不包含 color=auto.

的行

更直接的方法:

pid=$(pgrep raspivid)