Onlarla yürütülen bir komut başarısız olduğunda kabuk komut dosyalarımın başarısız olmasını istiyorum.
Genellikle ben ile yapmak:
set -e
set -o pipefail
(genellikle ekliyorum set -u
)
Mesele, yukarıdakilerin hiçbirinin süreç ikamesi ile çalışmadığıdır. Bu kod "Tamam" yazdırır ve başarısız olmasını istiyorum iken, dönüş kodu = 0 ile çıkmak:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Proses ikamesi için "boru arızası" ile eşdeğer bir şey var mı? Komutların çıktısını dosya oldukları gibi bir komuta iletmenin başka bir yolu var, ancak bu programlardan herhangi biri başarısız olduğunda bir hata mı oluşturuyor?
Fakirlerin insan çözümü, bu komutların stderr'e yazıp yazmadığını tespit eder (ancak bazı komutlar başarılı senaryolarda stderr'e yazar).
Başka bir daha posix uyumlu çözüm adlandırılmış borular kullanarak olurdu, ama derlenmiş koddan anında oneliners olarak inşa edilen bu komutlar-bu-kullanım-süreç-yerine koyma lauch gerekir ve adlandırılmış borular oluşturmak şeyler karmaşık (ekstra komutlar, bindirme hatası silme, vb.)
$$
ikame benim için çalışmaz, çünkü bu komut ikamesi, işlem ikamesi kullanan komut olarak yapılmaz, "kabuk olmayan" bir koddan (python) üretilen bir komut satırı içinde yapılır. Muhtemelen python'da alt süreç oluşturmalı ve onları programlı olarak yönlendirmeliyim.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Bu komut, bir okuyucu açılana kadar askıda kalacaktırpipe
çünküopen()
ve bu nedenle en kısa sürede bir okuyucu olarak oradapipe
fs için bağlantıpipe
olduğunurm
'd ve sonracat
kopyaları bu boru kabuğun tanımlayıcısı dışarı infile. Her neyse, bir işlem: <( ! : || kill -2 "$$")