You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:27:06