Programlar STDOUT / STDERR dışında başka bir yere nasıl gönderilir? Nasıl önlenir?


15

Görünüşe göre kullanılabilir tüm çıkış hedeflerini bilmiyorum. stdout( &1) Ve stderr( &2) hakkında biliyorum . Ancak, her iki tanımlayıcıyı yeniden yönlendirdikten sonra, bazen konsolumda hala bazı çıktılar alıyorum!

Düşünebileceğim en kolay örnek GNU Parallel; Her kullandığımda bir alıntı bildirimi görüyorum. Yaptığımda bile &2>1 > file, bildirimi hala görüyorum.

Aynı şey şu şekilde de geçerlidir emerge: Ortaya çıktığımda ve bazı problemler olduğunda, bazı bilgiler stdoutne yazdırılmaz ne de stdinyönlendirilir, çünkü onları yönlendiriyorum ve hala geçiyorlar.

Bu sorunları çoğunlukla kullanarak çözüyorum script, ancak hala bu soruna neyin neden olduğunu merak ediyorum.


1
Lütfen tam bir örnek veriniz .
Kusalananda


8
Onları almazsınız hepsi . Bir komut dosyası her zaman yazabilir /dev/tty.
Satō Katsura

1
GNU'ya gelince parallel: mkdir ~/.parallel; touch ~/.parallel/will-citesinir bozucu mesajı devre dışı bırakır. Alternatif olarak, uygulamasının diğer uygulamalarına da bakın parallel.
Satō Katsura

2
@OleTange Çünkü bu bir sorun değil - neden bir şey olduğunu soruyorum ve parallelörnek olarak kullanıyorum .
MatthewRock

Yanıtlar:


40

Kullandığınız sözdizimi yanlış.

cmd &2>1 >file

olarak bölünecek

cmd &
2>1 >file

Bu irade:

  1. cmdYönlendirme olmadan arka plan işi olarak çalıştır
  2. Ayrı bir işlemde (komut olmadan!) stderrKelimenin tam anlamıyla çağrılan bir dosyaya 1yönlendirir stdoutvefile

İstediğiniz sözdizimi:

cmd >file 2>&1

Operasyonların sırası önemlidir. Bu irade:

  1. yönlendir stdoutiçinfile
  2. Yönlendirme stderriçin &1- yani aynı dt olarakstdout

Sonuç her iki olmasıdır stderrve stdoutyönlendirilecektir file.

In bash, daha basit bir standart dışı (ve bu yüzden ben tavsiye etmiyorum, taşınabilirlik gerekçesiyle) sözdizimi cmd &> fileaynı şeyi yapar.


Güzel, teşekkürler. Diğer sorun olabilir /dev/tty, ancak umarım bu çok sık olmaz (eğer hiç değilse).
MatthewRock

5
atMakinenizde komut varsa ve kullanma ayrıcalıklarına sahipseniz, komutu aracılığıyla çalıştırabilirsiniz at now. Ayrıntılar için el kitabına bakın. Bu, komutu bir toplu işlem mekanizması aracılığıyla çalıştıracak ve işlemin asla yazılacak bir tty'si olmayacaktır. Ancak, genel olarak, bu son durum için endişelenmezdim. Tipik olarak yalnızca etkileşim gerektiren ve yönlendirmeye rağmen kullanıcılara bir şeyler göstermesi gereken işlemler kullanılır /dev/tty.
Stephen Harris

orada, bunu yaptım
davidbak

10

İki sorun var.

Birincisi, siparişin önemli, ikincisi önemlidir /dev/tty.

Bu komut dosyasını, çıktısını yakalamak istediğimiz örnek bir komut dosyası olarak kullanalım:

test.sh:

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

Şimdi komutların çıktılarını görelim:

./testmyscript.sh 2>&1 >/dev/null:

edada
ttdada

Değerlendirme sırası soldan sağa olduğundan, önce " çıktı aldığı stderryere yönlendiririz stdout(böylece konsol çıktısı)". Sonra "yönlendirme almak stdoutiçin /dev/nullBöyle bir durumla sonunda.:

stdout-> /dev/null stderr-> konsol

Bu yüzden doğru anlıyoruz:

./testmyscript.sh >/dev/null 2>&1

Ve şunu elde ederiz:

ttdada.

Şimdi "Redirect do stdoutiçin /dev/nulldaha sonra" ve "stdout'u gösterdiği yere Yönlendirme Stderr" (yani /dev/null). Yaşa!

Ancak, hala bir sorunumuz var; programı yazdırır /dev/tty. Şimdi bu tür bir davranışı nasıl düzeltebileceğimi bilmiyorum, bu yüzden muhtemelen ihtiyacınız olacak script, ancak umarım bu davranış çok sık olmayacaktır.

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.