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

How do i store the output of a bash command in a variable?

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

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

这是我的代码:

1
2
3
4
LINE=$(ps aux | grep '$1')
PROCESS=$LINE | awk '{print $2}'
echo $PROCESS
kill -9 $PROCESS

我想能够运行类似

sh kill_proc.sh node并运行

kill -9 node

但我得到的是

1
kill_process.sh: line 2: User: command not found

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


1
PROCESS=$(echo"$LINE" | awk '{print $2}')

1
PROCESS=$(ps aux | grep"$1" | awk '{print $2}')

我不知道你为什么得到你引用的错误。我不能复制它。当你这样说:

1
PROCESS=$LINE | awk '{print $2}'

外壳将其展开为如下所示:

1
PROCESS='mayoff  10732 ...' | awk '{print $2}'

(我缩短了EDOCX1的值(0),使示例可读。)

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

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

不要在子shell中设置PROCESS,在标准输入时不向awk提供任何内容,而是要将LINE的值输入awk,并将结果存储在当前shell中。因此,您需要运行一个命令,将LINE的值写入其标准输出,并将该标准输出连接到awk的标准输入。切普纳在回答中指出,echo命令可以做到这一点(或printf命令)。


您需要使用echoprintf$LINE的值实际放到awk命令的标准输入上。

1
2
3
4
LINE=$(ps aux | grep"$1")
PROCESS=$(echo"$LINE" | awk '{print $2}')
echo $PROCESS
kill -9 $PROCESS

不需要使用LINE;您可以用一条线设置PROCESS

1
PROCESS=$(ps aux | grep"$1" | awk '{print $2}')

或者更好,跳过grep

1
PROCESS=$(ps aux | awk -v pname="$1" '$1 ~ pname {print $2}')

最后,不要使用kill -9;这是调试错误程序的最后手段。对于任何你没有自己编写的程序,kill"$PROCESS"应该足够了。