Shell 从脚本调用脚本
如何让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 如您所见,无需测试特殊变量$?,我们直接使用。我通常采用以
#!/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
块中添加了另一个命令,它仍然可以工作。