为什么在Shell脚本中运行ps -f会出现BSD syntax error错误
Shell脚本问题修复方案
报错原因
- 核心报错直接原因:不同系统的
ps命令语法存在差异,BSD 风格的ps要求指定查询PID时必须显式添加-p参数,原脚本直接把pidof返回的PID跟在ps -f后面,不符合BSD语法要求就会抛出对应错误。 - 原有脚本还存在以下逻辑缺陷:
- 未定义
$arg、$num变量,case判断逻辑实际未生效,数值参数正常运行属于巧合 - 完全没有实现
--help参数的处理分支 - 未判断
pidof无返回的异常场景,输入不存在的进程名时也会报错 - 没有对输入参数做类型校验,无法正确区分数值PID和进程名
- 未定义
修复后完整脚本
#!/bin/sh # 无参数或传入--help时输出帮助信息 if [ $# -eq 0 ] || [ "$1" = "--help" ]; then echo "用法:" echo " $0 <PID> 查询指定PID对应的进程信息" echo " $0 <进程名> 查询指定名称对应的进程信息" echo " $0 --help 查看帮助说明" exit 0 fi # 校验输入是否为纯数字(PID格式) if echo "$1" | grep -qE '^[0-9]+$'; then # 按PID查询,统一加-p参数兼容BSD和SystemV语法 ps -f -p "$1" else # 按进程名查询,-s参数表示只取第一个匹配的进程,如需查询所有同名进程可删除-s pids=$(pidof -s "$1") if [ -z "$pids" ]; then echo "未找到名称为 $1 的运行进程" exit 1 fi ps -f -p $pids fi
测试方法
- 查询PID为1的进程信息:
./script.sh 1 - 查询所有bash进程信息:删除脚本中
pidof后的-s参数后执行./script.sh bash - 查看帮助信息:
./script.sh --help
内容的提问来源于stack exchange,提问作者10969_ shirazu_
相关产品推荐
相关产品推荐

