我在bash中有一系列相当复杂的命令,最终会返回一个有意义的退出代码.脚本后面的各个地方需要有条件地分支命令集是否成功.
目前我存储退出代码并以数字方式对其进行测试,如下所示:@H_404_2@
long_running_command | grep -q trigger_word status=$? if [ $status -eq 0 ]; then : stuff else : more code if [ $status -eq 0 ]; then : stuff else
出于某种原因,感觉这应该更简单.我们存储了一个简单的退出代码,现在我们重复输入数字测试操作来运行它.例如,我可以欺骗使用字符串输出而不是返回代码,这更容易测试:@H_404_2@
status=$(long_running_command | grep trigger_word) if [ $status ]; then : stuff else : more code if [ $status ]; then : stuff else
从表面上看,这看起来更直接,但我发现它很脏.@H_404_2@
如果其他逻辑不是那么复杂并且我只运行了一次,我意识到我可以将它嵌入到测试运算符的位置,但是当你需要在其他位置重用结果而不重新运行时,这并不理想.测试:@H_404_2@
if long_running_command | grep -q trigger_word; then : stuff else
到目前为止,我唯一发现的是将代码作为命令替换的一部分进行分配:@H_404_2@
status=$(long_running_command | grep -q trigger_word; echo $?) if [ $status -eq 0 ]; then : stuff else
即使这在技术上也不是一次性分配(尽管有些人可能认为可读性更好),但对我来说,必要的数值测试语法似乎仍然很麻烦.也许我只是在强迫症.@H_404_2@
简单的解决方案:
output=$(complex_command) status=$? if (( status == 0 )); then : stuff with "$output" fi : more code if (( status == 0 )); then : stuff with "$output" fi
或更多的优雅@H_404_2@
do_complex_command () { # side effects: global variables # store the output in $g_output and the status in $g_status g_output=$( command -args | commands | grep -q trigger_word ) g_status=$? } complex_command_succeeded () { test $g_status -eq 0 } complex_command_output () { echo "$g_output" } do_complex_command if complex_command_succeeded; then : stuff with "$(complex_command_output)" fi : more code if complex_command_succeeded; then : stuff with "$(complex_command_output)" fi
要么@H_404_2@
do_complex_command () { # side effects: global variables # store the output in $g_output and the status in $g_status g_output=$( command -args | commands ) g_status=$? } complex_command_output () { echo "$g_output" } complex_command_contains_keyword () { complex_command_output | grep -q "$1" } if complex_command_contains_keyword "trigger_word"; then : stuff with "$(complex_command_output)" fi