以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
你的问题是由于shell重定向和管道操作的工作方式导致的。当你在shell中执行命令并使用管道(|)连接多个命令时,每个命令都会在其自己的子shell中运行。这意味着你的grep和awk命令实际上是在子shell中运行的,而子shell的环境变量和文件重定向与主shell是分开的。因此,当你尝试将输出重定向到/opt/testid文件时,实际上是将子shell的输出重定向到了该文件,而不是主shell的输出。
为了解决这个问题,你可以使用命令替换(command substitution)来捕获管道命令的输出,并将其赋值给一个变量,然后将变量的值写入文件。在bash中,你可以使用反引号(``)或$()来实现命令替换。下面是一个示例:
TESTID=`ps -aux | grep test | grep -v grep | awk '{print $2}'`
echo $TESTID > /opt/testid
或者:
TESTID=$(ps -aux | grep test | grep -v grep | awk '{print $2}')
echo $TESTID > /opt/testid
这样,你就可以正确地将awk '{print $2}'的结果写入/opt/testid文件中了。不过需要注意的是,由于ps -aux | grep test可能会返回多个进程ID(如果多个进程包含相同的关键词),所以你可能需要进一步处理变量TESTID来满足你的需求。