在Linux中等待命令使用?


16
#!/bin/bash
function back()
{
    sleep $1
    exit $2
}
back $1 $2 &
b=$!
if `wait $!`;then
    echo success
else
    echo failure
fi
bash-3.00# ./back 300 0
failure
bash-3.00# ./back 300 1
failure

success当我发送0时,我原以为退出状态,但是我仍在failure

另外,wait请勿等待300秒。相反,我立即收到消息。我认为这$!$$我脚本中的直接子代。是不是

是否可以捕获wait like的退出状态exit_status=$(wait $!)

if ! ((exit_status));then
    echo sucess
else
    failure
fi

Answers:


20

问题是您wait在子shell中发布:

if `wait $!`;then

因为wait它是内置函数,而不是命令,所以它在subshel​​l而不是当前的shell上运行。

您将看到但不是的输出是:

wait: pid 12344 is not a child of this shell

...返回状态为1。

要执行测试,您将需要在不使用子外壳的情况下进行测试。

#!/bin/bash
function back()
{
  sleep $1
  exit $2
}
back $1 $2 &
b=$!

wait $b && echo success || echo failure

这将提供您期望的结果,并等待您期望的时间:

$ time ./test.sh 3 0
success
./test.sh 3 0  0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1  0.00s user 0.01s system 0% cpu 3.012 total

您可以使用$?以下命令检查任何命令的退出状态:

$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1

您的脚本中还有其他几个错误。您的#!电话线格式错误,我已修复。您分配$!$b,但不使用$b


12

移除反引号。

wait照原样,您正在子shell中执行,该子shell无法访问父shell的作业,因此它将立即失败。


如果要退出状态,请$?在等待后立即获取值。

command_here &
wait
status=$?

2

删除反引号将使程序正常运行,但并非完全由于已经确定的原因。的确wait立即失败,因为它运行在子外壳中并且无法访问其父进程,但是即使您使用了有效的命令,程序也无法按预期运行。

if语句运行一个程序,并检查其退出状态是零还是非零。使用反引号时,if语句将获取进程的输出,尝试将其作为程序运行,然后使用该进程的退出代码。因此,程序不会因为wait失败而失败,而是因为wait不会产生任何输出而失败。

您可以通过echo在反引号内使用脚本来使脚本工作:

if `echo wait $!`; then
    echo success
else
    echo failure
fi

或者只是删除反引号;每个人都更容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.