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时,它是空的。有人知道我做错了什么吗?
- var=`command`
- PROCESS=$LINE | awk '{print $2}'错误。将它与第一行进行比较。
- @etanneiser如果我尝试PROCESS=$(LINE | awk '{print $2}'),我仍然会得到一个错误LINE:找不到命令`
- 您还需要在$前面加上LINE的前缀(和echo的前缀)到管道中:$(echo $LINE | awk...)
- @Marcb the var=$(command)比较好…
- @切普纳我为什么要加上echo?
- 在LINE=$(ps aux | grep '$1')中,'$1'没有扩大。使用双引号,如LINE=$(ps aux | grep"$1")。
- 使用killall或pkill而不是自己滚动。
- PROCESS=$(awk '{print $2}' <<<"$LINE")
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命令)。
您需要使用echo或printf将$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"应该足够了。
- 有点不相关,但是…我不能真的终止这个过程。我的脚本不再抛出错误,但即使使用sudo运行,该过程也不会被杀死。思想?
- 把set -x放在脚本的顶部,以便更好地了解它在做什么。此命令使shell在运行每个命令之前对其进行回显。
- @多巴曲曼展示了全过程生产线。在STAT字段中包含Z?(Z=僵尸-不可分辨)。或者,您可能想要终止一个等待内核I/O的进程。
- @当$PROCESS将包含多个PIDs时,chepner-kill"$PROCESS"将杀死一个进程?(例如,grep创建了更多的进程)在这种情况下,不需要报价。
- 好点。我很少在代码中使用一个参数来保存一系列要在空白处拆分的值。