如何将bash命令的输出存储在变量中?
这个问题在这里已经有了答案:
PROCESS=$(echo "$LINE" | awk '{print $2}')
要么
PROCESS=$(ps aux | grep "$1" | awk '{print $2}')
我不知道你为什么得到你引用的错误。 我无法复制它。 当你这样说的时候:
PROCESS=$LINE | awk '{print $2}'
该shell将其扩展为如下所示:
PROCESS='mayoff 10732 ...' | awk '{print $2}'
(我已经缩短了$LINE
的价值,使这个例子可读。)
流水线的第一个子命令设置变量PROCESS
; 这个变量设置命令没有输出,所以awk
立即读取EOF并不打印任何内容。 而且,由于在子shell管道运行的每个子,的设置PROCESS
只发生在一个子shell,而不是在运行该脚本的母贝,所以PROCESS
还是不能设置为在脚本以后的命令。
(请注意,某些版本的bash
可以在当前shell而不是子shell中运行管道的最后一个子命令,但这不会影响此示例。)
除了在subshell中设置PROCESS
并且没有向awk
输入任何内容外,您想要将LINE
的值提供给awk
,并将结果存储在当前shell的PROCESS
中。 所以你需要运行一个命令,将LINE
的值写入其标准输出,并将该标准输出连接到awk
的标准输入。 echo
命令可以做到这一点(或者chepner在他的回答中指出的printf
命令)。
您需要使用echo
(或printf
)将$LINE
的值实际放置到awk
命令的标准输入中。
LINE=$(ps aux | grep "$1")
PROCESS=$(echo "$LINE" | awk '{print $2}')
echo $PROCESS
kill -9 $PROCESS
没有必要使用LINE
; 你可以用一行来设置PROCESS
PROCESS=$(ps aux | grep "$1" | awk '{print $2}')
或更好,跳过grep
:
PROCESS=$(ps aux | awk -v pname="$1" '$1 ~ pname {print $2}')
最后,不要使用kill -9
; 这是调试错误程序的最后手段。 对于你自己编写的任何程序, kill "$PROCESS"
就足够了。
上一篇: How do i store the output of a bash command in a variable?