2016-08-21 62 views
1

在一個shell腳本,這是很麻煩:替代設置+ E

#!/bin/sh -e 
# [...] 
set +e 
command-that-is-allowed-to-fail 
set -e 
# [...] 

它看起來容易出錯了。

有沒有更好的方法來做到這一點?

(順便說一句,答案出現在評論a partially related question.然而,問題和答案都沒有出現在計算器上,作爲一個適當的問題和答案,據我所知)。

+0

感謝您發現重複。我一直無法找到它。我的問題並不完全相同,事實證明,因爲另一個問題特別關注Bash。但是,它已經足夠接近它來關閉它了。 – thb

回答

2

是,有一個更好的方法—,或者無論如何,有一個更習慣,更terser,更容易出錯的方式。

#!/bin/sh -e 
# [...] 
command-that-is-allowed-to-fail || true 
# [...] 

看看如何工作?如果command-that-is-allowed-to-fail失敗,||操作員將控制權交給內置的true。後者除此之外什麼都不做:它永遠不會失敗。

順便提一下,還有一個false命令,除此之外它什麼都不做:它總是失敗。但是,在某些shell(如Dash)中,false不是內建的,因此您可能在某些情況下必須將其作爲/bin/false或類似名稱來調用它。

注意

一個導師教我關於2004年這個技術我懷疑,我會發現我自己的技術,因爲它是不明顯的給我。儘管這種技術簡單而有吸引力,但一旦人們熟悉這種技術。自從學習技術以來,我已經廣泛使用它。你也可以。

+1

我做'|| :'。 「真」這個詞太長了。 – PSkocik

+0

@PSkocik:那怎麼樣?顯然,'|| :'甚至可以在Dash中工作。因此,在2016年,12年後,我還可以學到新的東西,謝謝你。如果您選擇將您的評論作爲*答案,*我想加入它。 – thb

+1

謝謝,但我並不在意分數。除了':'在我的系統上沒有相應的可執行文件外,''''''''和':'完全是同義詞,AFAIK。 – PSkocik