Bazen stdout ve stderr komutlarını aynı konuma yönlendirmek istiyorsunuz , Bu ne zaman >&
kullanılıyor - bir dosya tanımlayıcısını diğerine işaret ediyor.
Örneğin, aynı stdout ve stderr'yi aynı dosyaya yazmak istiyorsanız ( /dev/null
ya da olsun output.txt
), bunları ayrı ayrı yönlendirebilirsiniz.
app 1>/dev/null 2>/dev/null
veya bir dosya tanımlayıcısını dosyaya, diğer dosya tanımlayıcısını da bir tanesine yönlendirebilirsiniz:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
İlk örnekte, 2>&1
dosya tanımlayıcısını # 2, # 1'in zaten işaret ettiği yere yönlendirir. İkinci örnek, sadece stderr ile başlayarak aynı şeyi başarır.
Başka bir örnek olarak, stdout'un (dosya tanıtıcısı # 1) istenen yere işaret ettiği durumlar vardır, ancak ada göre (bir boru, soket veya benzeri ile ilişkili olabilir) ismine başvuramazsınız. Bu genellikle normalde yalnızca stdout'u yakalayan işlem genişletme ( ` `
veya $( )
işleçler) kullanıldığında olur , ancak içine stderr eklemek isteyebilirsiniz. Bu durumda, >&
stderr'i stdout'a yönlendirmek için de kullanabilirsiniz :
out=$(app 2>&1)
Yaygın olarak kullanılan başka bir örnek, bir çağrı cihazı grep
veya benzeri bir yardımcı programdır, çünkü boru |
normalde yalnızca stdout üzerinde çalışır , çünkü stderr'i boruyu kullanmadan önce stdout'a yönlendirirsiniz:
app 2>&1 | grep hello
Nasıl hangisinin bilmek 2>&1
ya 1>&2
doğrudur? Zaten kurulmuş dosya tanıtıcı sağındaki gider >&
ve yeniden yönlendirmek istediğiniz dosya tanıtıcı sola gider. ( 2>&1
"nokta tanımlayıcı # 2'ye dosya tanımlayıcı # 1" anlamına gelir.)
Bazı kabuklarda ortak yönlendirmeler için kısayollar bulunur; İşte Bash'ten örnekler:
1>
sadece kısaltılabilir >
1>foo 2>&1
için >&foo
veya&>foo
2>&1 | program
için |& program
app 1>/dev/null 2>&1
Yapmanın, 2> & 1'in 1'in zaten yönlendirdiği dosyayı göstereceği anlamına geleceğini bilmiyordum . Anlayabildiğim kadar kolay yapabildimapp > /dev/null &>
mi?