如何将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 thevar=$(命令)
更好…在行=$(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}')