POSIX Shell中正确处理ps -ax全量输出的方法
符合POSIX sh标准的ps输出处理方案
嘿,这就给你两个完全适配POSIX sh环境的解决方案,完美解决你的需求:
方案一:将ps输出存入变量后执行grep
要完整保留ps -ax的多行输出到变量里,在POSIX sh中必须用双引号包裹命令替换,这样才能保留换行符。之后再通过管道把变量内容传给grep过滤:
# 把ps全量输出存入变量ps_output ps_output=$(ps -ax) # 过滤包含myApp的进程行(注意变量必须用双引号包裹) echo "$ps_output" | grep myApp
重点提醒:一定要用双引号包裹$ps_output,否则Shell会把换行符转换成空格,导致grep无法正确按行处理内容。
方案二:按行遍历结果(用while循环替代for)
for a in $(ps -ax)会把所有输出按空白字符(空格、换行、制表符)分割成单个单词,这显然不是你想要的按行遍历效果。在POSIX sh中,正确的做法是用while read循环,它天生支持按行读取输入:
方式1:直接过滤后遍历
如果只需要处理包含myApp的行,可以直接组合管道:
ps -ax | grep myApp | while read -r pid rest; do # pid是每行的第一个字段(进程PID),rest是该行剩余的所有内容 echo "找到目标进程PID: $pid" # 在这里添加你的后续处理逻辑,比如杀进程、统计信息等 done
方式2:先存全量输出再遍历
如果需要先保存ps -ax的全量输出,后续再做遍历过滤,可以用临时文件中转:
# 将ps全量输出写入临时文件 ps -ax > /tmp/ps_full.tmp # 遍历临时文件的每一行 while read -r line; do # 判断当前行是否包含myApp(-q让grep静默执行,只返回状态码) if echo "$line" | grep -q myApp; then echo "匹配到目标进程行: $line" # 添加你的处理逻辑 fi done < /tmp/ps_full.tmp # 用完临时文件记得删除 rm /tmp/ps_full.tmp
小技巧:read -r中的-r参数可以防止反斜杠被Shell解释转义,这是POSIX环境下的最佳实践,建议始终加上。
内容的提问来源于stack exchange,提问作者Human_BetaRelease
相关产品推荐
相关产品推荐

