【问题标题】:Bash evaluation: [ vs ||Bash 评价:[ vs ||
【发布时间】:2014-04-04 19:37:24
【问题描述】:

我有一个 pid 存储在一个文件中:

echo 394 > pid_stored

我正在检查一个 pid 是否正在运行:

kill -0 $(cat pid_stored) 2> /dev/null || echo "PID not running"

这就像一个魅力,但如果我想在真假情况下执行多个操作,我想我需要一个 if then fi 结构。但由于某种原因,我无法弄清楚 [ 或 [[ 不要以同样的方式评估:

if [[ $(kill -0 $(cat pid_stored) 2> /dev/null) ]]
then echo "PID IS NOT RUNNING"
fi

不起作用,它总是评估为真。错误流使用 2> 定向到 /dev/null,因为如果 pid 存在或失败,kill -0 评估为真

谢谢!

【问题讨论】:

    标签: linux bash shell unix scripting


    【解决方案1】:

    删除[[ and ]],因为它用于评估表达式:

    if kill -0 $(<pid_stored) 2> /dev/null
    then
       echo "PID IS RUNNING"
    else
       echo "PID IS NOT RUNNING"
    fi
    

    PS:你也可以避免cat$(&lt;pid_stored)

    要否定你可以使用:

    if ! kill -0 $(<pid_stored) 2> /dev/null
    

    【讨论】:

    • 太棒了,谢谢,好奇:我必须用 !我猜这与 || 相关操作员?如果你想在你的示例代码中更正它,以防有人找到这个答案,那将是相反的:如果!杀死 -0 $( /dev/null
    • 确定我已添加到我的答案中。
    • 我实际上使用nohup 将脚本作为后台进程运行,然后$(&lt;pid_stored) 表达式似乎不起作用,但cat 确实......关于为什么/如何的任何想法? nohup 会破坏重定向运算符吗?似乎保护程序坚持使用 cat 因为这样的脚本不太可能在前台运行..
    • 嗯,你能用cat -vte pid_stored 检查那里存储的内容吗?
    • cat -vte pid_stored 26185$
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多