【发布时间】:2010-04-16 16:31:11
【问题描述】:
有没有更优雅的方式来做到这一点(bourne shell)?
IsThereAnyApplesLeft
applesLeft=$?
通常在 c 或 java 中我会这样做:
applesLeft=IsThereAnyApplesLeft
【问题讨论】:
标签: bash unix scripting sh exitstatus
有没有更优雅的方式来做到这一点(bourne shell)?
IsThereAnyApplesLeft
applesLeft=$?
通常在 c 或 java 中我会这样做:
applesLeft=IsThereAnyApplesLeft
【问题讨论】:
标签: bash unix scripting sh exitstatus
退出状态通常是这样隐式使用的:
if IsThereAnyApplesLeft;then
echo "Apples left"
fi
【讨论】:
试试:
applesLeft=$(IsThereAnyApplesLeft > /dev/null)$?
是的,你必须使用$?,这是无法避免的。
【讨论】:
这两段代码不能直接比较。您的 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."
【讨论】:
$? 有什么不优雅的地方?
根据the Advanced Bash Scripting Guide,除了$?之外,没有其他方法可以获取退出码——嗯,除了$?之外,他们没有列出任何其他获取方法。如果有其他方法,肯定会在上面链接的退出代码部分列出。
【讨论】:
if IsThereAnyApplesLeft; then echo "yes"; else echo "no"; fi