Yanıtlar:
Arka plan için:
İlk önce bunların işlevini çözelim. Başvuru için Advanced Bash-Scripting Guide'a bakın .
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/null
nerede, "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>&N
olduğ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
.
Ben dışındaki diğer kabuklu çok ele ettik csh
ve 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.
2>&-
vs gibi bir şey yok 2>/dev/null
(bazı "kötü" yazılı programların 2>&-
doğru anlamadığı dışında )?
&>
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 zsh
en başından beri içeri girdiler ve henüz yeni eklenmişlerdi bash
. Daha rc
iyi tasarlanmış operatörler için de bakınız .
(+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.
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.
|&
ve &>/dev/null
vardır değil taşınabilir.
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).
&>
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.