2013-03-27 223 views
38

最后有没有像java try catch这样的linux bash命令? 或者linux的shell总是继续?Linux shell最后试试catch

try { 
    `executeCommandWhichCanFail` 
    mv output 
} catch { 
    mv log 
} finally { 
    rm tmp 
} 
+4

检查'&&'和''||见 – 2013-03-27 10:23:37

+0

http://stackoverflow.com/questions/7251619/how-can-i-尝试做某事然后检测如果它在bash中失败 – 2013-03-27 10:24:32

+0

http://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting – 2013-03-27 10:28:25

回答

69

嗯,有点:

{ # your 'try' block 
    executeCommandWhichCanFail && 
    mv output 
} || { # your 'catch' block 
    mv log 
} 

rm tmp # finally: this will always happen 
+3

请注意,您必须在'executeCommandWhichCanFail'后面使用'&&',否则它会盲目进行。即使你在前面用'set -e'(我不明白)。 – AJP 2014-01-09 14:55:40

+2

简洁而简洁。但我更喜欢使用'trap',因为'||'不能确保即使在特殊情况下(信号)也能执行其他部分,这几乎是'finally'所期望的。 – 2015-09-23 09:00:19

1

mv有两个参数,那么可能是你真的想猫的输出文件的内容:根据您的例子

53

,它看起来像你正在尝试做类似于总是删除临时文件的事情,而不管脚本如何退出。在Bash中,请尝试使用trap内置命令来捕获EXIT信号。

#!/bin/bash 

trap 'rm tmp' EXIT 

if executeCommandWhichCanFail; then 
    mv output 
else 
    mv log 
    exit 1 #Exit with failure 
fi 

exit 0 #Exit with success 

traprm tmp声明脚本退出时,总是执行,因此文件“TMP”永远试图将其删除。

安装的陷阱也可以重置;只有信号名称的陷阱调用会重置信号处理程序。

trap EXIT 

有关详细信息,请参阅bash的手册页:man bash

+1

使用“陷阱”的一个好处是,除了EXIT外,您还可以捕获其他信号。特别是,你可以捕获SIGINT(Control-C)。为此,只需在陷阱语句的末尾添加它即可。例如'trap'rm tmp'EXIT SIGINT'。 – ishmael 2014-06-18 23:29:03

+0

是的,SIGTERM也会有所帮助。使脚本健壮[清理tmp文件,即使'被杀死'] – C19 2015-01-07 13:05:02

+3

从一个快速测试看来,'EXIT'处理程序也**调用了'SIGINT'和'SIGTERM' – Cuadue 2015-01-08 21:59:41