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

时间:2014-08-27 19:37:53

标签: bash shell sh

我正在尝试编写一个用于终止进程的简单脚本。我已经阅读了Find and kill a process in one line using bash and regex所以请不要将我重定向到那个。

这是我的代码:

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

我希望能够运行像

这样的东西

sh kill_proc.sh node让它运行

kill -9 node

但我得到的是

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

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

2 个答案:

答案 0 :(得分:3)

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中进行,而不是在运行脚本的父shell中进行,因此PROCESS仍未设置为以后的命令你的剧本。

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

您希望将PROCESS的值提供给awk并将结果存储到标准输入中,而不是在子shell中设置LINE并且不向awk提供任何内容当前shell中的PROCESS。因此,您需要运行一个将LINE的值写入其标准输出的命令,并将该标准输出连接到awk的标准输入。 echo命令可以执行此操作(或printf命令,正如chepner在其答案中指出的那样。)

答案 1 :(得分:2)

您需要使用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"就足够了。