2> & -, 2> / dev / null, | &, &> / dev / null ve> / dev / null 2> & 1 arasındaki fark


192

Sadece arasındaki farkı arıyorum

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

ile ve onların taşınabilirlik non-Bourne shellsgibi tcsh, mkshvb


2
Mksh'nin &>GNU bash uyumluluğunu desteklerken , mevcut POSIX betiklerinin anlamlarını bozabileceği ve mksh'nin zaten POSIX modunda olanları devre dışı bırakabileceği için bunu kullanmamaya şiddetle teşvik edildiğini unutmayın.
mirabilos

Bunun ^ /dev/nullne işe yaradığını da gördüm ?
Balupton

Yanıtlar:


241

Arka plan için:

  • Bir sayı 1 = üzerinden standart (yani STDOUT)
  • bir sayı 2 = standart hata (yani STDERR)
  • açıkça bir numara verilmezse, o zaman 1 numara kabuk tarafından kabul edilir (bash)

İlk önce bunların işlevini çözelim. Başvuru için Advanced Bash-Scripting Guide'a bakın .

Fonksiyonlar

2>&-

Bu bir genel şeklidir M>&-nerede, "M" bir dosya tanıtıcı sayıdır. Bu, hangi dosya tanımlayıcısına başvurulursa, yani "M" için çıkışı kapatır .

2>/dev/null

Bu bir genel şeklidir M>/dev/nullnerede, "M" bir dosya tanıtıcı sayıdır. Bu dosya tanımlayıcısı, yönlendirir "M" ile, /dev/null.

2>&1

Bunun genel şekli, "M" ve "N" nin dosya tanımlayıcı numaraları M>&Nolduğu durumdur . "M" ve "N" dosya tanımlayıcılarının çıkışını tek bir akışta birleştirir.

|&

Bu sadece bir kısaltmadır 2>&1 |. Bash 4'te eklendi.

&>/dev/null

Bu sadece bir kısaltmadır >/dev/null 2>&1. Dosya tanımlayıcı 2'yi (STDERR) ve tanımlayıcı 1'i (STDOUT) yönlendirir /dev/null.

>/dev/null

Bu sadece bir kısaltmadır 1>/dev/null. Dosya tanımlayıcı 1'i (STDOUT) adresine yönlendirir /dev/null.

Bash, tcsh, mksh, vb. Özelliklerine taşınabilirlik

Ben dışındaki diğer kabuklu çok ele ettik cshve tcsh. Bash'ın yeniden yönlendirme operatörlerine kıyasla bu iki kişiyle olan deneyimim, bash'ın bu konuda üstün olduğudur. Daha fazla bilgi için tcsh man sayfasına bakın.

Hiçbiri hakkında sormadığınız komutlardan doğrudan csh / tcsh tarafından desteklenir. Benzer işlevleri oluşturmak için farklı sözdizimleri kullanmanız gerekir.


Bir kazananımız var. Ancak, hiçbir performans farkı ya da 2>&-vs gibi bir şey yok 2>/dev/null(bazı "kötü" yazılı programların 2>&-doğru anlamadığı dışında )?
Det

3
Performans farkı olmamalıdır.
slm

5
&>oldu bash(gerçi vurmak pek mümkün olduğunu ve orada farklı bir şey ifade olarak Bourne ve POSIX uyumluluğu kırar) baştan. >&ve |&gelip (t)csh(ve stderr'i yönlendirmenin tek yolu). Onlar zshen başından beri içeri girdiler ve henüz yeni eklenmişlerdi bash. Daha rciyi tasarlanmış operatörler için de bakınız .
Stéphane Chazelas 24:14

1
Güncelleme: performans sorunu hakkında burada da teyit edilir: unix.stackexchange.com/questions/163955/…
Det

1
Merhaba @slm, iletişim için teşekkürler. Depomun değişmediğine sevindim (+2-2=0). Şimdi, baskı bölümünde, çok fazla düzenleme yapmıyorum, ancak bu durumda, çünkü işlemden sonraki verilerin olacağına açıklık getirdi N. Cevabınızı okudum ve her açıdan çok iyi. Sadece bu küçük belirsizlik beni düşündürdü, bu yüzden baskı. Ama tamam, istediğiniz gibi yeniden eklemek veya reddetmekten çekinmeyin. Umarım konuyu açıklayabilirim. İyi çalışmaya devam et.
Dr Beco

11

Bu STDERR & STDOUT yönlendirmek için:

  • 2>/dev/null

    STDERR'i / dev / null konumuna yönlendir (konsolda görünmesini engelle)

  • |&

    STDERR ve STDOUT'yu boru komutunun STDIN'ine yönlendirin (cmd1 | & cmd2)

  • &>/dev/null

    Her iki STDERR ve STDOUT komutunu / dev / null konumuna yönlendir (konsolda hiçbir şey görünmüyor)

  • >/dev/null

    STDOUT'u / dev / null konumuna yönlendir (yalnızca STDERR konsolda gösterir)

  • 2>&-

    Yeniden yönlendirmede kullanılan bir dosya tanıtıcısını kapatmak içindir.

Bunların tümü Bourne mermileri için standart yönlendirme yöntemleridir.


4
|&ve &>/dev/nullvardır değil taşınabilir.
Chris Down,

4

Bunu seçilen cevabın eki olarak kabul edin. Hangi formların POSIX ve hangilerinin olmadığını bilmek isteyebilirsiniz.

İki POSIX formu söz konusudur:

2.7.2 Yönlendirme Çıkışı

Çıkışı yönlendirmek için iki genel format:

[N]> kelime

[N]> | kelime

isteğe bağlı n, dosya tanıtıcı numarasını gösterir. Numara ihmal edilirse, yönlendirme standart çıktıya atıfta bulunacaktır (dosya tanıtıcısı 1).

Noclobber seçeneği ayarlanmışsa (> set setinin açıklamasına bakınız) ve kelimenin genişlemesi ile adlandırılan dosya mevcutsa ve normal bir dosya ise, '>' formatını kullanarak çıkış yönlendirmesi başarısız olur. Aksi takdirde, '>' veya "> |" kullanarak yönlendirme biçimler, adı belirtilen dosya tanımlayıcısında çıktı için oluşturulacak ve açılacak olan sözcüğün genişlemesinden kaynaklanan dosyaya veya belirtilmemişse standart çıktıya neden olur. Dosya mevcut değilse, oluşturulacaktır; Aksi takdirde, açıldıktan sonra boş bir dosya olarak kesilecektir.

-

2.7.6 Bir Çıktı Dosya Tanımlayıcısının Çoğaltılması

Yönlendirme operatörü:

[N]> ve kelime

bir çıktı dosyası tanımlayıcısını diğerinden çoğaltacak veya bir tanesini kapatacaktır. Eğer kelime bir veya daha fazla rakam ile değerlendirilirse, n ile belirtilen dosya tanımlayıcısı veya n belirtilmezse standart çıktı, kelime ile belirtilen dosya tanımlayıcısının bir kopyası olarak yapılır; Eğer kelime içindeki rakamlar çıktı için zaten açık olan bir dosya tanımlayıcısını temsil etmiyorsa, bir yönlendirme hatası ortaya çıkacaktır; Kabuk Hatalarının Sonuçlarına bakınız. Sözcük '-' olarak değerlendirilirse, dosya tanımlayıcısı n veya n belirtilmezse standart çıktı kapatılır. Açık olmayan bir dosya tanımlayıcısını kapatma girişimleri bir hata oluşturmayacaktır. Eğer kelime başka bir şeye değerlendirirse, davranış belirtilmez.

Bu nedenle:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

Son satır asıl soruda değildir, ancak bash'ta şikayet etmeden çalışır. (Ayrıca / dev / null yerine / dev / tty ile çalışır).


1
Her zaman daha fazlasını bilmek istiyorum.
Det
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.