set -u kullanımı beklendiği gibi çalışmıyor


12

setKomut dosyamda farklı seçenekleri verimli bir şekilde nasıl kullanacağımı öğreniyorum ve set -ubir değişken düzgün ayarlanmadıysa (örn. Kullanıcıları silme) komut dosyamdan çıkmak için mükemmel görünüyor. Man sayfasına göre set -uve set -eaşağıdakileri yapar ...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

Bu işlevi test etmek için bir test komut dosyası oluşturdum, ancak beklendiği gibi çalışmıyor gibi görünüyor. Belki birisi sorunumu daha iyi açıklayabilir ve nerede yanlış yorumladığım? Test komut dosyası aşağıdadır. Teşekkür ederim.

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

Ben komut dosyası 0 ve "Bu işe yarar" görüntülemek için bekliyoruz ve sonra ${testing2}ayarlanmadı gibi başarısız .

Onun yerine görüntülenen am 0 ve "Bu eserler" tarafından takip edin 0 ve ardından 0 Bu görünmemelidir

Herkes bilgi verebilir mi? Teşekkür ederim.


1
Peki takip ... null dizesine bir değişken ayarını yasadışı hale getirmenin / bir hatayı artırmanın herhangi bir yolu var mı? Tahmin etmiyorum.
Luke Davis

Yanıtlar:


10

"Man Bash" den:

Bir parametreye bir değer atanmışsa ayarlanır. Boş dize geçerli bir değerdir. Bir değişken ayarlandıktan sonra, yalnızca unset yerleşik komutu kullanılarak ayarlanamayabilir.

Bunu yaptığınızda testing2=, değişkeni null dizesine ayarlarsınız.

Bunu olarak değiştirin unset testing2ve tekrar deneyin.


set -eBir atama 1. çıkış kodu 0 çıkış kodu vardır son komutu (atama) infaz olduğunu görmek için bu deneyin veya sahiptir asla bu durumda yardım etmez bu soruyu okumak :

$ false; a=""; echo $?
0

Ve set -e kullanımının daha çok bir çözüm olduğuna inanıyorum.

Ayarlanmamış değişkenlerin kullanımıyla ilgili bir hata ne olabilir set -u:

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

Çıktı olacak:

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

3

testing2=testing2değişkeni boş bir dizeye ayarlar ; değişken aslında ayarlanmıştır .

Ancak echo $testing99, etkileşimli bir Bash kabuğunda (ayar yapmadan errexit, yani set -e) çalışacak olsaydınız, bir hata alırsınız:

bash: testing99: unbound variable

bir kenara

Komut dosyalarını şu anda test ederken, etkileşimli olmayan bir kabuk (bir kabuk komut dosyası çalıştıran) her zaman çıkarken ayarlanmamış bir değişkeni genişletmeye çalışırken etkileşimli bir kabuğun her zaman çıkmadığını keşfettim . POSIX kılavuz sayfasına göre :set

-u Kabuk, ayarlanmamış bir değişkeni genişletmeye ve hemen çıkmaya çalıştığında standart hataya bir ileti yazar. Etkileşimli bir kabuk çıkmayacaktır.

Sürece interaktif Bash kabuk çıkmayacaktır errexitsahiptir da olmuştur set. Öte yandan, set -edaha önce çalıştırılsa bile etkileşimli bir çizgi kabuğu çıkmaz .


Tire, -e setiyle çıkmazsa; set -u; ayarlanmamış aa; echo $ aa, kısa çizgi yanlış.
schily

@schily Bunu ilk fark ettiğimde, çizgi yazarlarının benden daha iyi bildiğini ve POSIX spesifikasyonlarında bazı belirsizlikler olabileceğini, ancak pubs.opengroup.org/onlinepubs/9699919799/utilities/… 'ı tekrar kontrol ettiğimi düşündüm bir hataya benzediğine katılıyorum, tamam.
Anthony Geoghegan

Basit bir kural vardır: hem Korn Shell hem de Bourne Shell kabul ettiğinde ve başka bir kabuk uygulamasında bir sapma olduğunda, diğer kabuk yanlış davranır.
schily
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.