如何将 bash 命令的输出存储在变量中?

dop*_*man 8 bash shell sh

我正在尝试编写一个简单的脚本来终止进程。我已经阅读了使用 bash 和 regex 在一行中查找并终止进程,所以请不要将我重定向到该处。

这是我的代码:

LINE=$(ps aux | grep '$1')
PROCESS=$LINE | awk '{print $2}'
echo $PROCESS
kill -9 $PROCESS
Run Code Online (Sandbox Code Playgroud)

我希望能够运行类似的东西

sh kill_proc.sh node 让它运行

kill -9 node

但我得到的是

kill_process.sh: line 2: User: command not found
Run Code Online (Sandbox Code Playgroud)

我发现当我登录时$PROCESS它是空的。有谁知道我做错了什么?

rob*_*off 4

PROCESS=$(echo "$LINE" | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

或者

PROCESS=$(ps aux | grep "$1" | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

我不知道你为什么会收到你引用的错误。我无法重现它。当你这样说时:

PROCESS=$LINE | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

shell 将其扩展为如下所示:

PROCESS='mayoff  10732 ...' | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

(我缩短了 的值$LINE以使示例易于阅读。)

管道的第一个子命令设置变量PROCESS;这个变量设置命令没有输出,因此awk立即读取 EOF 并且不打印任何内容。并且由于管道的每个子命令都在子 shell 中运行,因此设置PROCESS仅在子 shell 中进行,而不是在运行脚本的父 shell 中进行,因此PROCESS仍然不会为脚本中的后续命令设置。

(请注意,某些版本可以bash在当前 shell 中而不是在子 shell 中运行管道的最后一个子命令,但这不会影响此示例。)

您不想PROCESS在子 shell 中进行设置并且在标准输入上不提供任何内容,而是希望提供toawk的值并将结果存储在当前 shell 中。因此,您需要运行一个命令,将 的值写入其标准输出,并将该标准输出连接到 的标准输入。命令可以做到这一点(或者命令,正如切普纳在他的回答中指出的那样)。LINEawkPROCESSLINEawkechoprintf