Komutları düşünün
eval false || echo ok
echo also ok
Normalde, bunun falseyardımcı programı yürütmesini bekleriz ve çıkış durumu sıfır olmadığından echo okve ardından yürütülür echo also ok.
Toplamda POSIX gibi kullandığım kabukları ( ksh93, zsh, bash, dash, OpenBSD kshve yash), olacağı da bu, ama her şey biz etkinleştirirsem ilginçleşiyor set -e.
Eğer set -egeçerli olan, OpenBSD'nin shve kshkabuklar (her ikisi de elde edilen pdkshyü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 -eaktif olmaktan bağımsız olurdu ).
Bu sorunu çözmenin yolu evalalt 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 okolmadanset -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 okile 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 falseBir AND-OR listesinin veya koşullu ifadenin parçası olsa bile komut dosyasını sonlandırmayı bekler misiniz ? Yapmazdım.
set -edoğ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 -ebu yüzden ``) cevaptır.
eval falsesıfır olmayan bir durum oluşturur, bu yüzdenset -ekomut dosyasını o noktada sonlandırmayı beklerim.!set -eİfadesi olarak uygulanmadığı takdirde!, çıkış durumunu açıkça kontrol eder.