给出一组pids和代码:
for i in ${listedPids[@]}
do
runningCheck="ps -u $USER | grep $i"
grepRes=(${runningCheck})
if [[ -n $grepRes ]]
then
echo $grepRes
echo $runningCheck
... code not related to the issue
fi
done
无论这些pid是否有效;我一直从echo $ grepRes获得'ps',而echo $ runningCheck的输出显示正确的用户名和pid。我错过了什么?
答案 0 :(得分:1)
替换
"ps -u $USER | grep $i"
通过
$(ps -u $USER | grep $i)
命令替换:Bash通过执行命令并使用标准输出替换命令替换来执行扩展 命令,删除任何尾随换行符。
答案 1 :(得分:1)
我简化了你的脚本,这就是它的样子。
for i in "${listedPids[@]}"
do
grepRes=$(ps --no-heading -p $i)
if [[ -n "$grepRes" ]]
then
echo "$grepRes"
... code not related to the issue
fi
done
可以使用while
循环编写更短的代码。
ps --noheading -p "${listedPids[@]}" | while read grepRes
do
echo "$grepRes"
... code not related to the issue
done
答案 2 :(得分:0)
正如alvits和l0b0指出的那样,我做了一些语法错误:grepRes=(${runningCheck})
当我只想执行该行而不是将其转换为列表时,事实管道和重定向在变量中不起作用。最后,pgrep完成了这项工作,因为我只需要继续循环,直到所有后台进程结束。
答案 3 :(得分:-2)
也许你可以试试eval。
runningCheck1="ps -u $USER"
runningCheck2=" | grep $i"
echo $runningCheck1$runningCheck
eval $runningCheck1$runningCheck2