ps
的输出(可能是数组?)。以下是该命令的示例和输出:
$ ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh
3089 python /var/www/atm_securit 37:02
17116 python /var/www/atm_securit 00:01
17119 python /var/www/atm_securit 00:01
17122 python /var/www/atm_securit 00:01
17125 python /var/www/atm_securit 00:00
将其转换为bash脚本(片段):
for tbl in $(ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh)
do
echo $tbl
done
但是输出结果变成了:
3089
python
/var/www/atm_securit
38:06
17438
python
/var/www/atm_securit
00:02
17448
python
/var/www/atm_securit
00:01
如何在Bash脚本中像在shell输出中那样循环遍历每一行?
ps -p "$pid" -o etime
。当然,你也可以使用ps .. | grep
命令行,但仍需将其管道传递给while read ...
… - hek2mglIFS
,命令替换的扩展仍然受到路径名扩展的影响,因此for
循环是错误的。 - chepnercmd | while read
这个方法有几个可能的问题,具体取决于循环内部的内容:while 循环在子 shell 中运行,因此它设置的变量等不会在循环结束后继续存在;如果循环中有任何内容从 stdin 读取,则会消耗命令输出。如果出现问题,可以改用while read -u3 -r ... done 3< <(cmd)
。但是<( ... )
结构并不适用于所有 shell,请确保使用 bash-only shebang(#!/bin/bash
,而非#!/bin/sh
)启动脚本。 - Gordon Davissonwhile read
。如果 while 循环内的命令从 stdin 读取,则建议将< /dev/tty
重定向到该命令中(如果适用)。但您的建议也是一个好点!最终这取决于具体情况。我不想过多扩展答案,而且我通常认为for
循环存在更多问题。 - hek2mgl