IFS null değeri, ayarlanmamış IFS ile aynı değil mi?


13

Burada IFS'yi Anlama adlı harika bir soru okudum . Şaşırdım çünkü cevaplar ve yorumlar, IFS = 'nin ayarlanmamış IFS ile aynı olmadığını belirten POSIX' i gösteriyor. IFS ayarını kaldırırsanız, görünüşe göre varsayılan değer kullanılır. Bunun yerine IFS'yi null yaparsanız, ayırıcı yoktur. Bunu farklı bir şekilde gördüğümü biliyordum ve bunu yer imlerimde buldum:

Bourne Shell Programlama

$ IFS

Senaryonuzdaki ilk ifade şöyle olmalıdır:

IFS =

giriş alanı ayırıcısını varsayılan değerine sıfırlar. Aksi takdirde, sh ayrıştırma dizelerini beklediğinizden farklı yapmak ve tuhaf davranışlar oluşturmak için $ garip bir değere ayarlamış olabilecek kullanıcıdan $ IFS miras alırsınız.

Peki bu bir süre önce doğru muydu yoksa yazar yanlış mı?

Yanıtlar:


20

Stack Exchange'de bulduğunuz cevaplar doğru ve bu eğitici yanlış. Kendiniz deney yapabilir veya standartta arayabilirsiniz . Bir ayarlanmazsa IFSboş iken, uzay-tab-yeni satır varsayılan değere ayarlayarak eşdeğerdir IFSetkili bir alan bölme kapanır.

Sen danışabilirsiniz IFS üzerinde Sven Mascheck sayfasını tarihsel uygulamaları hakkında. Birkaç tarihi mermi hoşlanmadı unset IFSve ksh'ın çok eski bir versiyonu ona boş gibi davrandı, IFSancak tüm modern mermiler ve çoğu eski mermi, ayarlanmamış IFSdeğeri varsayılan değer gibi ele alıyor .

IFS=Alan ayırmayı kapatmak istemediğiniz sürece komut dosyanızla başlamamalısınız (bu makul bir karar olabilir - ancak bunu da kapatmazsanız, globbingden kaçınmak için ikame etrafına çift tırnak koymanız gerektiğini unutmayın set -f). Varsayılan değeri sıfırlamak için tuşunu kullanın unset IFS. Bunun bir komut dosyasının başında yararlı olup olmadığı tartışmalıdır; PATHarayanın senaryonuzu yanlış yapmak için yapabileceği tehlikeli gibi birçok kötü şey var .

Bu eğitici ayrıca sıfırlamayı önerir PATH. Bu genellikle kötü bir tavsiye. Çoğu durumda, doğru arama yolunun ne olduğunu tahmin edemezsiniz, ancak kullanıcı bilir. Nasıl mı biliyorsun /usr/local/binya /home/bob/binolanlar nerede eski UNix araçlardan hata sabit sürümlerini içeren /usr/binarabası vardır? Gerçekten koymak olmadığını anlamaya gömmek tüm mantık istiyorsunuz /usr/xpg6/binöncesinde /bin? Hangi pozisyonda istiyorsunuz /usr/gnu/bin? Betiğiniz belirli bir sistemi hedeflemedikçe PATH'ı sıfırlamayın.

Bu öğreticiyi okumadım, ama bir şeyi kontrol ettim: Başlangıçtan itibaren her zaman değişken ikameler ve komut ikameleri etrafında çift tırnak koymanızı söylemez. Bu yüzden bu öğreticinin iyi olduğunu düşünmüyorum.


unset IFSalan ayırmayı sıfırlasa da IFS'yi bash'daki varsayılan değerine sıfırlamaz.
Melab

@Melab varsayılan değerine unset IFSsıfırlanmaz IFS, sıfırlar . Ancak bir küme, varsayılan değere ayarlanan IFSetkiye sahiptir IFS.
Gilles 'SO- kötü olmayı kes'
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.