无论PID结果如何,当从ps传递到grep时,Bash脚本输出始终为'ps'

时间:2015-11-25 19:53:16

标签: linux bash grep

给出一组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。我错过了什么?

4 个答案:

答案 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