`Set -e` ile bash script`… &&… `komutunda durmuyor


14

Ben ilk hatayı bash komut dosyası durdurmakset -e için kullanın .

Komutu &&:

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

ile karşılaştırıldığında:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

İlk örnek hala yankılanıyor I'm running!, ancak ikincisi yanmıyor. Neden farklı davranıyorlar?

UPD. Benzer soru: /programming/6930295/set-e-and-short-tests


İlk örnekte ne olmasını bekliyorsunuz?
Flup

@Flup Komut dosyasının başarısız cdkomuttan sonra durmasını bekliyorum
907th

1
Davranışın şaşırtıcı olduğu yerler hakkında genel bir tartışma için bkz. BashFAQ # 105set -e .
Charles Duffy

Yanıtlar:


10

Bu, belgelenmiş davranıştır. Bash (1) man sayfası için diyor set -e,

Başarısız komut hemen aşağıdaki komutu listenin bir parçası ise kabuk çıkmasını sağlamaz whileveya untilanahtar kelime, aşağıdaki testin bir parçası ifveya elifayrılmış bir deyişle, bir idam herhangi komutun bir parçası &&veya ||listedeki son aşağıdaki komutu dışında &&veya|| herhangi komut satırında ancak sonuncusunda veya komutun dönüş değeri ters çevriliyorsa !.
[Vurgu eklendi.]

Ve POSIX Kabuk Komut Dili Şartname bu doğru bir davranış olduğunu doğrulamaktadır:

-eAşağıdaki bileşik listeyi yürütürken ayarı yok edilecektir while, until, if, veya elifayrılmış kelimesinden itibaren bir boru hattı !ayrılmış kelime veya son dışındaki bir AND-OR listenin herhangi bir komut.

ve Bölüm 2.9.3 Bu belgenin listeleri tanımlar

AND-OR listesi, " &&" ve " ||" operatörleri tarafından ayrılmış bir veya daha fazla boru hattının bir dizisidir .


9

Bu set -eseçenek bazı durumlarda etkili olmaz ve bu standart davranıştır ve POSIX uyumlu kabukta taşınabilir.


Başarısız komut, ardışık düzenin bir parçasıdır:

false | true; echo printed

yazdıracaktır printed.

Ve sadece boru hattının kendisinin başarısızlığı düşünülür:

true | false; echo 'not printed'

hiçbir şey basmaz.


Aşağıdaki bileşik listede başarısız komut çalıştırma while, until, if, elifözel amaçlı sözcüğünü, bir boru hattı ile başlayan !ayrılmış kelime veya bir parçası olarak herhangi komuta &&veya ||sonuncusu hariç listede:

false || true; echo printed

Son komut başarısız olursa hala set -eetkilenir:

true && false; echo 'not printed'

Alt kabuk bileşik bir komutta başarısız olur:

(false; echo 'not printed') | cat -; echo printed

Teşekkür ederim! Kullanmak daha açık echo "printed"ve echo "not_printed"örneklerinizde (yerine echo 1) daha açık olurdu .
907th

3
Not set -eiçinde bir çıkış nedenleri (false && true); echo not hereiçinde değil { false && true; }; echo hereYMMV olsa farklı kabukları ve aynı kabuğun hatta farklı sürümleri ile. set -eBir mavna direği ile dokunmak olmaz ve bunun yerine uygun hata işleme yapmak.
Stéphane Chazelas

1

benim tahminim if-then koşulu bir bütün olarak doğru değerlendirir.

denedim

set -e
if cd not_existing_dir
then  echo 123
fi
echo "I'm running! =P"

kim verir

-bash: cd: not_existing_dir: No such file or directory
I'm running! =P

hata kodu koşul tarafından yakalanırsa, bash yürütme sonunu tetiklemez.


Ama kullanmıyorumif ... fi
907th

Biliyorum, bu örtük bir.
Archemar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.