Komutları düşünün
eval false || echo ok
echo also ok
Normalde, bunun false
yardımcı programı yürütmesini bekleriz ve çıkış durumu sıfır olmadığından echo ok
ve ardından yürütülür echo also ok
.
Toplamda POSIX gibi kullandığım kabukları ( ksh93
, zsh
, bash
, dash
, OpenBSD ksh
ve yash
), olacağı da bu, ama her şey biz etkinleştirirsem ilginçleşiyor set -e
.
Eğer set -e
geçerli olan, OpenBSD'nin sh
ve ksh
kabuklar (her ikisi de elde edilen pdksh
yürütürken) komut sona erer eval
. Başka hiçbir kabuk bunu yapmaz.
POSIX, özel bir yerleşik yardımcı programdaki (örneğin eval
) bir hatanın etkileşimli olmayan kabuğun sonlanmasına neden olması gerektiğini söylüyor . Yürütmenin false
"bir hata" oluşturup oluşturmadığından tamamen emin değilim (eğer öyleyse, set -e
aktif olmaktan bağımsız olurdu ).
Bu sorunu çözmenin yolu eval
alt kabuğa koymak gibi görünüyor ,
( eval false ) || echo ok
echo also ok
Soru, bunu POSIX-ly doğru kabuk komut dosyasında yapmam gerekip gerekmediği veya OpenBSD'nin kabuğunda bir hata olup olmadığı mı? Ayrıca, yukarıda bağlantılı POSIX metninde "hata" ile kastedilen nedir?
Ek bilgi: OpenBSD mermileri komutta ve komut echo ok
olmadanset -e
eval ! true || echo ok
Orijinal kodum şöyle görünüyordu
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
hangi olur değil çıkış not ok
ile string=false
(o sonlandırmak olurdu) OpenBSD kabukları kullanarak ve emin yanlışlıkla veya yanlış anlama, ya da başka bir şey tarafından, tasarım gereği olduğunu değildi.
eval false
Bir AND-OR listesinin veya koşullu ifadenin parçası olsa bile komut dosyasını sonlandırmayı bekler misiniz ? Yapmazdım.
set -e
doğru davranış olup olmadığını ayarlamak emin değilim ... Koşullu bir ifadede sonlandırılmasının mantıklı olduğunu kabul ediyorum.
set -e
bu yüzden ``) cevaptır.
eval false
sıfır olmayan bir durum oluşturur, bu yüzdenset -e
komut dosyasını o noktada sonlandırmayı beklerim.!
set -e
İfadesi olarak uygulanmadığı takdirde!
, çıkış durumunu açıkça kontrol eder.