我想在shell中通过ps列出一个包含其信息的进程。 这是我的剧本:
#!/bin/sh
for line in `ps aux| grep test.py`
do
echo $line
done
但输出是:
hey
13241
0.0
0.3
48388
13528
pts/18
S+
18:50
0:00
python
test.py
hey
13370
0.0
0.0
14504
1016
pts/21
S+
19:00
0:00
grep
test.py
它将行划分为多个部分,但我希望我能得到一个关于进程的行信息,其名称为test.py,如终端中的命令:
hey 13241 0.0 0.3 48388 13528 pts/18 S+ 18:50 0:00 python test.py
hey 13446 0.0 0.0 14504 976 pts/21 S+ 19:08 0:00 grep --color=auto test.py
如何解决
答案 0 :(得分:1)
根据melpomene的评论,这应该适用于keeping compatibility to sh。
#!/bin/sh
ps aux | grep test.py | while IFS= read -r line; do
printf '%s\n' "$line"
done
答案 1 :(得分:1)
read
命令将从标准输入读取一行并将其放入变量中。当它到达输入结束时,它将以状态1退出,您可以使用它来结束while循环:
ps aux | grep test.py | while read line; do
echo LINE:
echo "$line"
echo
done
如果你想要它,read
将使用内部字段分隔符(IFS)将输入拆分为单独的变量,如果输入的字段多于变量,它将在它到达你的时间时停止分割最后一个变量,只需将行的其余部分(未分割)放在那里。
这意味着如果你只提供一个变量(我在上面的例子中称之为“line”),你将得到整行,unsplit,你不必担心设置IFS。