【问题标题】:Bourne Shell: Graceful way to get exit statusBourne Shell:获得退出状态的优雅方式
【发布时间】:2010-04-16 16:31:11
【问题描述】:

有没有更优雅的方式来做到这一点(bourne shell)?

IsThereAnyApplesLeft
applesLeft=$?

通常在 c 或 java 中我会这样做:

applesLeft=IsThereAnyApplesLeft

【问题讨论】:

    标签: bash unix scripting sh exitstatus


    【解决方案1】:

    退出状态通常是这样隐式使用的:

    if IsThereAnyApplesLeft;then
       echo "Apples left"
    fi
    

    【讨论】:

    • +1 除非您确实需要实际的退出代码;但我通常不希望在 c 之外这样做
    • 不要忘记短路条件:IsThereAnyApplesLeft && echo "Apples Left"
    【解决方案2】:

    试试:

    applesLeft=$(IsThereAnyApplesLeft > /dev/null)$?
    

    是的,你必须使用$?,这是无法避免的。

    【讨论】:

    • +1 聪明!而且,假设没有输出到 stdout(或 stderr),可以省略重定向。
    【解决方案3】:

    这两段代码不能直接比较。您的 bash 示例正在创建一个子进程来运行名为“IsThereAnyApplesLeft”的可执行文件,等待该子进程完成并将子进程的退出代码存储在变量 $?这样你就可以检查它并采取相应的行动。

    这实际上是一个相当复杂的交互,并且在 C 中做同样的事情需要大量的代码。您必须 fork() 一个子进程,让父进程 wait4pid() 在子进程的 pid 上,同时在子进程中调用文件“IsThereAnyApplesLeft”上的 execl() 以使其运行。使用 shell 脚本语言的好处之一是它对你隐藏了这类东西。

    相比之下,您的 C 代码 sn-p 只是调用 C 函数并将结果存储在局部变量中。在 bash 中看起来像这样:

    IsThereAnyApplesLeft()
    {
            echo 498
    }
    
    applesLeft=`IsThereAnyApplesLeft`
    echo "there are $applesLeft apples left."
    

    【讨论】:

      【解决方案4】:

      $? 有什么不优雅的地方?

      根据the Advanced Bash Scripting Guide,除了$?之外,没有其他方法可以获取退出码——嗯,除了$?之外,他们没有列出任何其他获取方法。如果有其他方法,肯定会在上面链接的退出代码部分列出。

      【讨论】:

      • 只有当你想保留退出状态时。如果只打算使用一次status,可以直接在测试中使用if IsThereAnyApplesLeft; then echo "yes"; else echo "no"; fi
      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2011-10-20
      相关资源
      最近更新 更多