【问题标题】:how does this if-statement work? (shell scripting )这个 if 语句是如何工作的? (外壳脚本)
【发布时间】:2021-07-06 10:38:59
【问题描述】:
if $* >/dev/null 2>&1; then
        echo Command \""$*"\" succeeded
else
        echo Command \""$*"\" failed
fi

据我了解: 传递的参数在“黑洞”中输出。 然后stderr 被重定向到stdout。 但是为什么这会导致成功发出传递的命令时满足条件呢?

【问题讨论】:

    标签: shell ubuntu unix


    【解决方案1】:

    通过if $* >/dev/null 2>&1; then 命令:

    • 一般语法是if COMMANDS; then。在你的情况下,COMMANDS 只是一个命令$* >/dev/null 2>&1

    • 此命令将输出重定向到空设备 (>/dev/null) 并将错误输出重定向到标准输出 (2>&1),因此也重定向到空设备。

    • 通过扩展$* 检索命令本身。这个特殊变量扩展为 shell 脚本的参数。

    所以本质上:命令及其参数是从$* 扩展的,并且输出以及错误输出重定向到空设备。

    【讨论】:

    • 但是如果输出和错误输出重定向到空设备,应该没有输出吧?为什么脚本可以检测命令是否成功执行?
    • 是的,没有输出。但是命令的成功并不取决于输出。命令是否成功取决于其退出状态。这是一个整数值,存储在内核的进程信息表中。如果退出状态为 0,则命令执行成功。任何其他值都意味着命令不成功。
    • 是的,这是我的问题 0 总是意味着假,但是 shell 是否认识到这个零来自一个成功执行的命令并将其解释为真?
    • 为什么你认为 0 意味着假?如果您来自 C 背景,那么是的,在 C 0 中等于 false。但这不是普遍的事实,例如在 Ruby 0 中,它就像任何其他整数一样,是一个真值。关于退出状态码,0 表示成功,任何其他数字表示错误。这就是它的定义方式。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多