2016-12-07 20 views
7

Lütfen dikkat: Bu sitede tek bir kabuk değişkenini sınama hakkında birçok soru var. Bu soru, tanımlanmamış herhangi bir değişken için bir komut dosyasını test etmektir.Tanımlı olmayan değişkenleri bash olarak nasıl hata yapabilirim?

Sen yürütme herhangi hatayı görmeden bash tanımlanmamış bir değişkeni kullanabilirsiniz:

#!/bin/bash 

echo ${UNDEF_FILE} 
ls -l ${UNDEF_FILE} 

exit 0 

Bu çok hata eğilimli buldum. Bir değişkenin adını büyük bir komut dosyasında değiştirmek veya bu değişkeni kaldırmak istersem, önceki tüm eski referanslar komut dosyasında hatalara neden olur. Bazen bu hata ayıklamak için açık değil veya ne zaman çok geç olduğunu öğrenir.

Bu neden izin verilir? Tanımlanmamış değişkenleri işaretlemenin bir yolu var mı?

+0

"Neden" 1970'ler dönemi kabuklarıyla uyumluluğa geri dönüyor. Eğer tarihin aksine, en iyi uygulamaları önemsiyorsanız, statik kontrol - http://shellcheck.net/ ile olduğu gibi, aynı zamanda [tek başına bir araç olarak] indirilebilir [https://github.com/koalaman]/shellcheck) - arkadaşın burada. –

+1

Açıkçası, tanımlanmamış değişkenlerin genişletilmesinin hatalı yapılması birçok yaygın deyimi bozar. '[[$ var]] & {echo" $ var ile bir şeyler yapmak "; } ', örneğin, set -u' ile kırılır: set -e'den farklı olarak (bu, yalnızca arızaları kontrol edemeyen veya koşulsuz olarak kullanılan hatalar yapar),' set -u' * her * referansı yapar tanımsız bir değişken bir hata. –

+0

(Bu arada - tüm-büyük harf değişken isimleri, kabuk veya işletim sistemi anlamında çevre değişkenleri için POSIX tarafından tanımlanmış alanlardır, en az bir küçük harf içeren değişkenlerin ad alanı, uygulama kullanımı için ayrılmıştır. Yalnızca, ortam değişkenlerinin aksine, tüm kabuk değişkenlerine, sonrakinin üzerine bir ortam değişkeni içeren bir ad paylaşımı olan bir kabuk değişkeninin ayarlanması nedeniyle). –

cevap

9

Sen kullanabilirsiniz:

set -u 

Senaryonuzun başlangıcında tanımlanmamış değişkenler kullanırken bir hata oluşturması. "@" Ve "*" bir hata olarak parametre genişletme performans özel parametreleri dışında

-u

tedavi sertleşmemiş değişkenler ve parametreleri. Bir unset değişkeni veya parametresi üzerinde genişletme denenirse, kabuk bir hata iletisi yazdırır ve etkileşimli değilse sıfır olmayan bir durumla çıkar.

+3

... ancak, ... Bu faydası olduğuna işaret değer tartışmalı öyle olmasını istiyor. –

+2

'set -o nounset',' set -u' (Bash) ile aynı etkiye sahiptir ve bazı insanlar bunu tercih eder. – pjh

+1

bakınız [kullanıldığında değişken bash ayarlanmışsa, test “set -o nounset”] (http://stackoverflow.com/q/7832080/4154375) kullanılarak neden olduğu ortak sorunları ele yollarını '-u' ayarlamak veya "set -o nounset". – pjh

0

set -u daha genel bir seçenektir, ancak diğer cevabı verenler Açıklamalarda belirttiği gibi oyuna set -u ile deyimsel kabuk programları yazmaya sorunlar var. Bir alternatif, belirli bir değişken ayarlanmadığında bir hata veren parametre genişletmeleri oluşturmaktır. Bu hata etkileşimli olmayan bir kabuğun çıkmasına neden olur. Bu hata, etkileşimli olmayan bir kabuk çıkmasına neden olur. Bu, bir hata koşulunun kontrol akışının tanımsız bir değerle devam etmesine izin vermeyeceğini garanti etmenin hızlı bir yolunu sunar. The spec, etkileşimli bir kabukta bile olsa, bir işlevde bu hata oluşursa, bir işlev çağrısından başlayacağını belirtmekle birlikte, etkileşimli bir kabuk çıkmak gerekmez.