Linux 无论PID结果如何,从ps传输到grep时,Bash脚本输出始终为“ps”

Linux 无论PID结果如何,从ps传输到grep时,Bash脚本输出始终为“ps”,linux,bash,grep,Linux,Bash,Grep,给定PID数组和代码: for i in ${listedPids[@]} do runningCheck="ps -u $USER | grep $i" grepRes=(${runningCheck}) if [[ -n $grepRes ]] then echo $grepRes echo $runningCheck ... code not relate

给定PID数组和代码:

    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。我缺少什么?

替换

"ps -u $USER | grep $i"

命令替换:Bash通过执行您的命令并用命令的标准输出替换命令替换来执行扩展 命令,删除任何尾随的换行符


也许你可以试试eval

runningCheck1="ps -u $USER"
runningCheck2=" | grep $i"
echo $runningCheck1$runningCheck
eval $runningCheck1$runningCheck2

我简化了你的脚本,下面是它的样子

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循环可以编写更短的代码


正如alvits和l0b0指出的,我犯了一些语法错误:grepRes=${runningCheck}当我只想执行那一行,而不是将它转换为列表时,管道和重定向在变量中不起作用。最后,pgrep完成了这项工作,因为我只需要继续循环,直到所有后台进程结束。

这可能会有所帮助:您不能将复杂的命令放入变量中。尤其是那些有管道的。请参见.grepRes=${runningCheck}将字符串作为数组元素分配给grepRes。如果打印${grepress[@]},您将看到整个${runningCheck}。也许您的意思是grepRes=$${runningCheck}?当您有pid时,不要使用ps-u$USER | grep pid。您可以使用ps-no heading-p pid.OP简化它,它有一个pid列表。grep系列(包括pgrep)都不是必需的。ps-无标题-p$i将产生他需要的结果。无。eval几乎从来都不是正确的解决方案。当然,这不是因为试图使用不合适的字符串而导致的问题。对于${listedPids[@]}中的i,如果它确实是一个数组。如果没有引号,您将在每个条目之间使用IFS的第一个字符扩展数组,然后再次拆分它。当然,如果使用默认的IFS值,并且只使用数字数组内容,那么应该不会产生任何影响,但是为什么要让shell做所有额外的工作呢?此外,将check命令放在标量数组中,并将其扩展为要运行的命令是有害的,并且在任何比此稍微复杂的用例中都会非常严重地中断。参见BashFAQ 50:另外,echo$foo与echo$foo相反,是一种反模式。请参阅@CharlesDuffy中的第14条-感谢您的挑剔,这有助于改进代码。我将添加这些,即使我不相信grepRes会有需要防止单词分裂的值。不过,我已更新了我的答案。
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
ps --noheading -p "${listedPids[@]}" | while read grepRes
    do
        echo "$grepRes"
            ... code not related to the issue
    done