2015-11-28 156 views
4

我寫一個Korn Shell腳本在那裏我有這樣如何在shell腳本雙管後執行多個命令

#!/bin/ksh 
myfunc() { 
    some_command1 || return 1 
    some_command2 || return 1 
    ... 
} 

在詞的功能,我把雙管之後返回語句,以便該函數在命令失敗時立即返回。

但我也希望它在返回前打印一些錯誤信息,我想

#!/bin/ksh 
myfunc() { 
    some_command1 || echo "error while doing some_command1"; return 1 
    some_command2 || echo "error while doing some_command2"; return 1 
    ... 
} 

但它不工作,第一個return語句總是得到無論some_command1執行的成功或失敗。

而且

#!/bin/ksh 
myfunc() { 
    some_command1 || (echo "error while doing some_command1"; return 1) 
    some_command2 || (echo "error while doing some_command2"; return 1) 
    ... 
} 

也不起作用,現在看來,這只是從子進程不是函數返回和some_command2獲得不管some_command1執行的成功或失敗。

是否有辦法將語句echo "error while doing some_command2"; return 1組合在一起,使得它們只有在前面的命令失敗時才能一起執行。

+2

'{cmd1; CMD2; }'也許? –

+0

我喜歡那個函數的風格 - 先排除異常,並避免嵌套的ifs。 –

回答

7

直接的方法是使用{ ...; ...; },它結合了命令而不創建子shell。

some_command1 || 
    { echo "error while doing some_command1"; return 1; } 

我不推薦使用標準錯誤的錯誤消息,雖然:

some_command1 || 
    { echo "error while doing some_command1" >& 2; return 1; } 

而只是因爲我可以,我給你我的祕密捷徑:

some_command1 || 
    return 1 $(echo "error while doing some_command1" >& 2) 

這最後位是非常規的,但仍然是便攜式的POSIX外殼。

+1

不知何故解決方案#1和#2對我來說不起作用,它就像沒有花括號一樣存在,並且總是執行'return 1'。但#3的作品很有魅力。 – asinkxcoswt

+1

對不起,我只是想出了爲什麼解決方案#1和#2不適合我,這是因爲我這樣寫:'{回聲「444」; return 1}'返回1後沒有分號。這使得return語句每次都執行 – asinkxcoswt

+4

@asinkxcoswt,'{'和'} **必須在它們周圍留有空白。請參閱https://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping –

相關問題