ps -x|grep命令行运行正常 放入shell脚本执行失败是什么原因
报错根因
你使用的read pid_found < "ps -x|cut -c1-5|grep $old_pid"写法中,shell会将<重定向符后的内容统一识别为本地文件路径,你传入的带管道的命令字符串会被当成文件名去磁盘查找,自然会抛出「没有该文件或目录」的错误。
你提到read variable_name < "command"写法在脚本其他位置可正常运行,是因为其他场景下引号内的command本身就是真实存在的本地文件名,而非需要执行的命令逻辑,所以不会触发报错。
正确实现方案
你之前看到的variable_name=$(command)命令替换写法是行业通用的标准写法,你测试不生效大概率是写法有误,正确用法如下,无需生成临时文件即可实现需求:
pid_found=$(ps -x | cut -c1-5 | grep "$old_pid" | wc -c)
如果你确实需要保留read语法,也可以使用bash的进程替换特性实现:
read pid_found < <(ps -x | cut -c1-5 | grep "$old_pid" | wc -c)
<(命令)语法会将命令执行结果模拟成临时文件描述符供重定向读取,不会触发文件查找错误。
简化优化方案
你当前的判断逻辑还可以进一步精简,不需要截取进程输出、统计字符数,直接用pgrep工具判断指定PID是否存活更高效,优化后的完整脚本如下:
#!/bin/bash cd /home/automan/vms_feed # 读取OldPID文件内容 old_pid=$(<OldPID) # pgrep匹配到对应PID会返回0退出码,匹配失败返回非0 if pgrep "$old_pid" > /dev/null 2>&1 then echo "Running: test, old pid found" else echo "Running: test, old pid not found" fi echo $$ > OldPID echo "Finished: test"
内容的提问来源于stack exchange,提问作者ilya187
相关产品推荐
相关产品推荐

