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

如何将bash命令的输出存储在变量中?,bash,shell,sh,Bash,Shell,Sh,我正在尝试编写一个简单的脚本来终止一个进程。我已经读过了,所以请不要把我引向那个 这是我的代码: LINE=$(ps aux | grep '$1') PROCESS=$LINE | awk '{print $2}' echo $PROCESS kill -9 $PROCESS 我希望能像这样做 sh kill_proc.sh节点并运行它 kill-9节点 但我得到的是 kill_process.sh: line 2: User: command not found 我发现当我记录$PROC

我正在尝试编写一个简单的脚本来终止一个进程。我已经读过了,所以请不要把我引向那个

这是我的代码:

LINE=$(ps aux | grep '$1')
PROCESS=$LINE | awk '{print $2}'
echo $PROCESS
kill -9 $PROCESS
我希望能像这样做

sh kill_proc.sh节点
并运行它

kill-9节点

但我得到的是

kill_process.sh: line 2: User: command not found
我发现当我记录
$PROCESS
时,它是空的。 有人知道我做错了什么吗

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

我不知道你为什么会得到你引用的错误。我无法复制它。当你这么说的时候:

PROCESS=$LINE | awk '{print $2}'
外壳将其扩展为以下内容:

PROCESS='mayoff  10732 ...' | awk '{print $2}'
(为了使示例可读,我缩短了
$LINE
的值。)

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

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


您不需要在子shell中设置
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
不需要使用
;您可以用一行设置
进程

PROCESS=$(ps aux | grep "$1" | awk '{print $2}')
或者最好跳过
grep

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

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

PROCESS=$LINE | awk'{print$2}'
是错误的。将其与第一行进行比较。@EtanReisner如果我尝试
PROCESS=$(line | awk'{print$2}')
我仍然会得到一个错误
line
:未找到命令`您仍然需要将
$
前缀添加到
line
(和
echo
将其放入管道):
$(echo$line | awk…
@MarcB the
var=$(命令)
更好…在
行=$(ps aux | grep'$1')
中,
'$1'
未展开。使用双引号,如
LINE=$(ps aux | grep“$1”)
有点不相关,但。。。我无法真正终止这个过程。我的脚本不再抛出错误,但即使使用
sudo
运行,进程也不会停止。想法?将
set-x
放在脚本的顶部,以便更好地了解它在做什么。此命令使shell在运行命令之前回显每个命令。@dopatraman显示完整的进程行。在
STAT
字段中包含
Z
?(Z=僵尸-不可怀疑)。或者,您可能想要杀死一个等待某个内核I/O的进程。@chepner当
$process
包含多个
PID时,
杀死“$process”
将杀死一个进程?(例如,grep建立了更多的流程)。。。在这种情况下,不需要引用。这是很好的观点。我很少编写使用单个参数来保存一系列要在空白处拆分的值的代码。
PROCESS=$(ps aux | awk -v pname="$1" '$1 ~ pname {print $2}')