/ dev / stderr vs.> & 2'ye çıktı gönderme


11

Komut dosyalarında hatalar genellikle dosya tanımlayıcı 2'ye şu şekilde gönderilir &2, yani:

echo "error" >&2

/dev/stderrBunun yerine bazen kullanılır:

echo "error" > /dev/stderr 

Baktığımda, /dev/stderrbunun sadece bir symlink olduğunu görüyorum, bu da (şu anki terminalimde) /proc/self/fd/2bir symlink /dev/pts/5.

Biraz karmaşık görünüyor. Bunun arkasında bir mantık var mı?

Kullanmak /dev/stderrve &2eşdeğer mi?

Bunlardan herhangi biri diğerine tercih edilir mi?


3
echo "error" >2ad 2ve içerik içeren bir dosya oluşturur error.
Cyrus


Düzenlememin 2 yerine 2 yeniden yayınlandığını görüyorum. Sorunuz aslında >2, veya ile ilgili >&2mi?
Jeff Schaller

Yanıtlar:


13

Özel aygıt /dev/stderrsisteme özgüdür, dosya tanımlayıcı 2(özel aygıt değil /proc/self/fd/2) taşınabilirdir. Taşınabilir olmayan kod yazmak istiyorsanız, bu özel cihazlar başlamak için iyi bir yerdir.

Şu birkaç sistem var /dev/stderr: Linux ve elbette OSX . Ancak OSX'in hiçbir /procdosya sistemi yoktur ve onun /dev/stderrbir bağlantısıdır /dev/fd/2.

Daha fazla okuma:


Ayrıca birisinin yapmak istediği durum da vardır. bu sabit kod değil 2> bla.logboru 2ve sürece çalışır /dev/stderr. Temelde 2vermez ihtiyaç olmaya stderrçıktı.
larkey

6

Bash ve diğer kabuklarda, bir şeyi standart hataya yönlendirmenin yolu kullanmaktır >&2. Bash /dev/stderr, dosya tanımlayıcı olarak açılır 2. Dosya tanımlayıcılarına, tanımlayıcının sayısının &Nnerede Nolduğu referans verilir. Böylece, standart hataya echo error >&2yazdırır .error/dev/stderr

Ayrıca /dev/stdoutdosya tanımlayıcı olarak açılır 1. Bu, yapabileceğiniz anlamına gelir echo output >&1. Bununla birlikte, her şey varsayılan olarak yine de standart çıktıya basıldığından, bu echo outputkendi başına aynıdır .

Şimdi, 2>farklı. Burada, bir komutun hata çıktısını başka bir yere yönlendiriyorsunuz. Yani, 2>file"dosya tanımlayıcı 2'ye yazdırılan her şeyi (standart hata)" konumuna yeniden yönlendirme "anlamına gelir file.


3

Haklısın >&2, daha doğrudan ve mükemmel "deyimsel". Eşdeğer olmalılar, bu yüzden kullanmak için özel bir neden yok>/dev/stderr . Bunun dışında, okuyan biri bunların ne yaptığını bilmiyorsa, bunlardan birini bulmak diğerinden daha kolay olabilir :-). Ama genel olarak kullanmanızı öneririm >&2.

/ dev / stderr, programlar belirtilen bir dosya adına hata yazdığında ancak stderr'ı desteklemediğinde yararlı olabilir. Açıkçası bu biraz çelişkili; / dev / stdout çok daha kullanışlıdır. (Son zamanlarda mysql_safesarmalayıcı komut dosyasının konsola hata yazmayacağını buldum ; maalesef hata günlük dosyasındaki izinleri de değiştirmek istiyor, bu nedenle / dev / stderr kullanmak birkaç gereksiz uyarıya neden oluyor).

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.