Shell 从脚本调用脚本

Shell 从脚本调用脚本,shell,Shell,如何让shell脚本向我回显它调用的脚本已失败 #!/bin/sh test="/Applications/test.sh" sh $test exit 0 exit 1 /Applications/test.sh脚本应该经过良好编码,以常规状态退出0如果正常,如果失败则为>0 如您所见,无需测试特殊变量$?,我们直接使用 /Applications/test.sh脚本应该经过良好编码,以常规状态退出0如果正常,如果失败则为>0 如您所见,无需测试特殊变量$?,我们直接使用。我通常采用以

如何让shell脚本向我回显它调用的脚本已失败

#!/bin/sh

test="/Applications/test.sh"

sh $test

exit 0
exit 1
/Applications/test.sh
脚本应该经过良好编码,以常规状态退出<代码>0如果正常,如果失败则为
>0

如您所见,无需测试特殊变量
$?
,我们直接使用

/Applications/test.sh
脚本应该经过良好编码,以常规状态退出<代码>0
如果正常,如果失败则为
>0


如您所见,无需测试特殊变量
$?
,我们直接使用。

我通常采用以下方法:

#!/usr/bin/env bash

test="/Applications/test.sh"
sh "${test}"
exit_status=$?
if [[ ${exit_status} ]] ; then
    echo "Error: ${test} failed with status ${exit_status}." >&2
else
    echo "Success!"
fi

我通常采取以下方法:

#!/usr/bin/env bash

test="/Applications/test.sh"
sh "${test}"
exit_status=$?
if [[ ${exit_status} ]] ; then
    echo "Error: ${test} failed with status ${exit_status}." >&2
else
    echo "Success!"
fi

就最佳实践而言,您不应该这样做。如果脚本失败,它应该在终止之前发出错误消息,这样它的父脚本就不必这样做。这样做的主要原因是进程知道它失败的原因,而父进程只能猜测。换句话说,你应该写:

#!/bin/sh

test="/Applications/test.sh"

sh $test
尽管事实上,更典型的做法是写:

#!/bin/sh
/Applications/test.sh

test.sh
将发出必要的错误消息,脚本将返回与test.sh相同的值。此外,在当前形式下,脚本将始终成功,即使
test.sh
由于
退出0而实际失败;退出1
是毫无意义的:永远不会调用退出1

就最佳实践而言,您不应该这样做。如果脚本失败,它应该在终止之前发出错误消息,这样它的父脚本就不必这样做。这样做的主要原因是进程知道它失败的原因,而父进程只能猜测。换句话说,你应该写:

#!/bin/sh

test="/Applications/test.sh"

sh $test
尽管事实上,更典型的做法是写:

#!/bin/sh
/Applications/test.sh


test.sh
将发出必要的错误消息,脚本将返回与test.sh相同的值。此外,在当前形式下,脚本将始终成功,即使
test.sh
由于
退出0而实际失败;退出1
是毫无意义的:永远不会调用退出1

test.sh
是否遵循在成功时返回0,否则返回非零的约定?是的,它会进行测试。sh也有退出0退出1只有第一个
exit
可以执行示例中的任何操作;第二个永远不会到达,因为您已经使用第一个退出。sh是否遵循在成功时返回0,否则返回非零的惯例?是的,它进行测试。sh也有退出0退出1只有第一个
退出
在您的示例中可以执行任何操作;无法访问第二个脚本,因为您已使用第一个脚本退出。不幸的是,并非所有第三方脚本都表现良好,有时需要对其进行包装。不幸的是,并非所有第三方脚本都表现良好,有时需要对其进行包装。+1,但使用
[如果
/bin/sh
是一个基本shell(例如,不是
bash
),则[
将失败。更安全的做法是:
if!test$exit_status=0;then
。此外,失败消息可能应该直接发送到stderr。
$?
经常被noobs这样使用,因为他们不理解
如果为true;那么…;否则…;fi
@sputnick:…或者是想先测试然后报告值的人。!你可以回复使用:
if$test;then echo Success;else echo“Error:$test failed with status$?”>&2;fi
输入值。无需使用
exit\u status
变量。@williampersell:可以。我发现我的格式更可读。此外,如果在
then
块中添加了另一个命令,它仍然可以工作。+1,但使用
[如果
/bin/sh
是一个基本shell(例如,不是
bash
),则[
将失败。更安全的做法是:
if!test$exit_status=0;then
。此外,失败消息可能应该直接发送到stderr。
$?
经常被noobs这样使用,因为他们不理解
如果为true;那么…;否则…;fi
@sputnick:…或者是想先测试然后报告值的人。!你可以回复使用:
if$test;then echo Success;else echo“Error:$test failed with status$?”>&2;fi
exit\u status
变量进行rt运算。@williampersell:可以。我发现我的格式更具可读性。此外,如果在
then
块中添加了另一个命令,它仍然可以工作。