POSIX mermilerinde .özel bir yerleşiktir, bu nedenle başarısızlığı kabuğun çıkmasına neden olur (bazı mermilerde bashsadece POSIX modundayken yapılır).
Hata olarak nitelendirilen şey kabuğa bağlıdır. Hepsi dosyayı ayrıştırırken bir sözdizimi hatasıyla çıkmaz, ancak çoğu kaynak dosya bulunamadığında veya açılamadığında çıkar. errexitKaynak dosyadaki son komut sıfır olmayan bir çıkış durumu ( seçenek elbette açık olmadığı sürece) ile döndürülürse çıkacak herhangi bir bilmiyorum .
İşte yapıyor:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
Eğer varsa, dosyayı kaynaklamak istediğiniz bir durumdur ve yoksa (veya burada boşsa -s) yapmayın .
Yani, dosya orada değilse bir hata (POSIX kabuklarında ölümcül hata) olarak değerlendirilmemelidir, bu dosya isteğe bağlı bir dosya olarak kabul edilir.
Dosya okunamazsa veya bir dizin olsaydı yine de (ölümcül) bir hata veya ayrıştırılırken sözdizimi hatası olsaydı rapor edilmesi gereken gerçek hata koşulları olurdu.
Bazıları bir yarış koşulu olduğunu iddia eder. Ama bu demektir tek şey dosya arasına kaldırılırsa kabuk hata vererek terk edeceği olacağını [ve ., ama senaryo ise bu sabit yolu dosya ortadan aniden olacağını o bir hata göz önünde bulundurulacak geçerli olduğunu iddia ediyorum çalışan.
Diğer yandan,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
burada command¹ , komutun özel niteliğini kaldırır .(bu nedenle hatada kabuktan çıkmaz) şu şekilde çalışmaz:
.hatalarını gizler, ancak kaynaklı dosyada çalıştırılan komutların hatalarını da gizler
- dosya yanlış izinlere sahip gibi gerçek hata koşullarını da gizler.
Diğer yaygın sözdizimleri (örneğin henüz grep -r /etc/default /etc/init*dönüştürülmemiş init komut dosyaları için Debian sistemlerinde systemd(burada EnvironmentFile=-/etc/default/serviceisteğe bağlı ortam dosyası belirtmek için kullanılır) şunları içerir):
[ -e "$file" ] && . "$file"
Dosyayı kontrol edin, boşsa yine de kaynak yapın. Hala açılamıyorsa ölümcül hata (orada olmasına rağmen veya orada olmasına rağmen). (Var [ -f "$file" ]ve normal bir dosya), [ -r "$file" ](okunabilir) veya bunların kombinasyonları gibi daha fazla varyant görebilirsiniz .
[ ! -e "$file" ] || . "$file"
Biraz daha iyi bir versiyon. Dosyanın mevcut değil durumda olduğunu netleştirir. Bu aynı zamanda $?çalıştırılan son komutun çıkış durumunu da yansıtacağı anlamına gelir $file(önceki durumda, alırsanız 1, bunun var olup olmadığı $fileveya bu komutun başarısız olup olmadığını bilmiyorsunuz ).
command . "$file"
Dosyanın orada olmasını bekleyin, ancak yorumlanamıyorsa çıkmayın.
[ ! -e "$file" ] || command . "$file"
Yukarıdakilerin birleşimi: dosya orada değilse ve POSIX mermileri için, dosyayı açma (veya ayrıştırma) başarısızlıkları rapor edilir, ancak ölümcül değildir (bu daha arzu edilir olabilir ~/.profile).
¹ Not: In zshancak, kullanamaz commandöyle içeri sürece shöykünme; Korn kabuğunda, sourceaslında bir takma ad command ., özel olmayan bir varyant.