Çıktı yeniden yönlendirmesinde tam olarak ne anlama geliyor?


19

Stderr'i yönlendirmek için command 1> outveya bunun gibi şeyler görüyorum 2>&1, ancak bazen &>kendi başına da görüyorum , vb.

Anlamanın en iyi yolu nedir &ve tam olarak ne anlama gelir?

Yanıtlar:


26

&İçinde 2>&1sadece numara söylüyor 1bir dosya tanıtıcı değil, bir dosya adıdır. Bu durumda standard output file descriptor.

Kullanırsanız 2>1, bu, hataları adlı bir dosyaya yönlendirir, 1ancak kullanırsanız 2>&1, adresine gönderir standard output stream.

Bu &>iki göndermek diyor standard outputve standard errorbir yerde. Örneğin ls <non-existent_file> &> out.file,. Bunu bir örnekle açıklayayım.

Kurmak:

  1. kokoAşağıdaki içeriğe sahip bir dosya oluşturun :

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Yürütülebilir yap: chmod u+x koko

  3. Şimdi bunun j1olmadığını unutmayın

  4. Şimdi koş ./koko &> output

  5. koş cat outputve göreceksin

    ls: cannot access 'j1': No such file or directory
    koko2
    

Hem standard error( ls: cannot access 'j1': No such file or directory) hem de standard output( koko2) dosyaya gönderildi output.

Şimdi tekrar çalıştırın ama bu sefer şöyle:

./koko > output

Yapın cat outputve sadece koko2benzerlerini göreceksiniz . Ancak ls j1komuttan hata çıktısı alınmaz . Bu, standard errorterminalinizde göreceğiniz adrese gönderilecektir.

@Byte Commander sayesinde önemli not:

İçinde olduğunu unutmayın command >file 2>&1yönlendirme sırasına önemlidir. Eğer yazarsanız command 2>&1 >file(istediğini normalde değil) yerine, ilk komut var yönlendirir stdouto yönlendirmenin komut dosyasına ve sonra stderronun artık kullanılmayan için stdoutterminal görünecektir böylece, ve boru bunu could veya yönlendirebilen tekrar, ancak dosyaya yazılmaz.


2
Ne &>anlama geliyor?
AJJ

1
İçinde olduğunu unutmayın command >file 2>&1yönlendirmeler sırasına önemlidir. Eğer yazarsanız command 2>&1 >file(istediğini normalde değil) yerine, ilk dosyaya komutun stdout'u yönlendirir ve o yönlendirmenin sonra şimdi kullanılmayan Stdout'a komutun Stderr, bu terminali görünecektir böylece ve boru bunu could veya yeniden yönlendirin, ancak dosyaya yazılmaz.
Byte Komutanı

2
Diyerek şöyle devam etti: "Bu, standard outputterminalinizde göreceğiniz yere gönderilecek ." bu "için" olmamalı standard errormı?
frarugi87

1
Evet @ frarugi87 Hakkınız düzeltildi
George Udosen

1
@George wow, hızlıydınız;) İyi iş
çıkardınız


1

[n]>&wordDenir Kopyalama Çıktı Dosya Tanıtıcı (bkz bölüm 2.7.6 POSIX Kabuk Dil Standardının). Bu özel davranış içeren kabuklar, Bourne benzeri özelliğidir ksh, dashve bash; Aslında, standart Bourne kabuğu ve ksh. İçine bakıyor tcsh ve csh kılavuzları, onlar görünüşte ancak açıklamasında, herhangi bir dosya tanıtıcı çoğaltma yeteneği sağlamaz >&, bu gibi davranan &>içinde bash(olduğunu yönlendirmeler hatalar ve dosyaya normal çıkış).

Ubuntu dahil olmak üzere * nix benzeri sistemlerde, genellikle her şeyin bir dosya olduğunu veya bir dosya tanımlayıcı olduğunu duyarsınız . Standart çıktı sabit dosya tanımlayıcı 1 ve standart hata dosya tanıtıcı 2. Yani olup, > FILE 2>&1teknik olarak diğer bir deyişle dosya tanımlayıcı 1. üzerine yinelenen dosya tanıtıcı 2 demektir bu cevap :

2> & 1, kabuğa komuta tanımlayıcı 1'in kopyası olan bir dosya tanımlayıcı 2 vermesini söyler (yani stderr ve stdout aynı fd'yi gösterir).

Buradaki anahtar, önce tanımlayıcı 1'in ayarlanması gerektiğini belirtmektir. Kabuk yeniden yönlendirmeleri soldan sağa doğru işlediğinden command >FILE 2>&1, kabuğa stdout'u önce commandgirmesi için yeniden sarmasını söyler FILEve ancak o zaman tanımlayıcı 2 1'in kopyası olabilir, yani 1 ve 2 noktası aynı konuma - FILE.

Bu elbette standart hatanın ve standart çıktının ötesine geçer. Bu cevapta gösterildiği gibi , yaparak3&>2

... filedescritor 2'yi filedescriptor 3'e kopyalarsınız (dup2), açıksa filedescriptor 3'ü kapatırsınız

Dosya tanımlayıcıları manipüle etmenin bir örneği, komut çıktısını değişkene yakalamak olabilirdialog

Ayrıca &>özel olduğunu belirtmek gerekir bash. Bu zshaynı şekilde davranır, ancak belgelere göre, "... multios varlığında '> word 2> & 1' ile aynı etkiye sahip değildir". POSIX uyumlu olarak /bin/sh, bu komut arka plana koyarak düzenli yeniden yönlendirme olarak değerlendirilir. Ayrıca bkz. Sözdizimsel olarak geçerli bash kodu olmayan herhangi bir sh kodu var mı? .

Ayrıca bakınız:

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.