Yönlendirme sırası


29

Bilgisayarın bu komutu nasıl okuduğunu pek anlamadım.

cat file1 file2 1> file.txt 2>&1

Eğer anlarsam, 2>&1Standart Hatası sadece Standart Çıktıya yönlendirin.

Bu mantıkla, komut bana şöyle okur:

  1. dosyaları birleştirmek file1ve file2.

  2. göndermek stdoutiçin bu operasyondan file.txt.

  3. göndermek stderriçin stdout.

  4. son?

Bilgisayarın ne yaptığını bilmiyorum. Mantığa göre, komut

cat file1 file2 2>&1 > file.txt

ama bu doğru değil.

Yanıtlar:


46

Ödevleri kullanmayı düşünmeyi daha kolay buluyorum.

  • > gibi =
  • & gibi $

İle başlarsın

1 = /dev/tty
2 = /dev/tty

sonra ilk örneğiniz 1> file.txt 2>&1, yapar

1 = file.txt
2 = $1           # and currently $1 = file.txt

seni bırakarak

1 = file.txt
2 = file.txt

Aksi halde yaptıysan, yine başla.

1 = /dev/tty
2 = /dev/tty

o zaman 2>&1 > file.txtyapar

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

bu yüzden sonuç

1 = file.txt
2 = /dev/tty

ve sadece yönlendirildin stdout, değil stderr.


Ben bir benzetme alıyorum ama bu kafa karıştırıcı - ne anlama geliyor $?
Eliran Malka

Böyle bir ödevde var=$othervar, $sağ taraftaki değişken adı tanıtır. Böyle bir yönlendirme olarak 2>&1, &sağ taraftaki dosya tanıtıcı numarasını tanıtır. "Dosya 2 eşittir 1 dosyası" gibi düşünebilirsiniz. (Ancak iki tür eşittir: <"okumak için" ve >"yazmak için" anlamına gelir.)
Mikel

12

Yönlendirme sırası önemlidir ve soldan sağa okunmaları gerekir .

Örneğin: command 2>&1 >somefileanlamı:

  1. Yönlendirme stderr(yani 2için) mevcut hedef stdout(bu noktada, terminal).
  2. Sonra stdoutgitmek için değiştirin somefile.

Yani bu durumda, stderrterminale stdoutgider ve bir dosyaya gider, ki muhtemelen istediğiniz şey bu değildir.

Öte yandan, şu command >somefile 2>&1anlama gelir:

  1. yönlendir stdoutiçinsomefile
  2. Ardından ( ) ile stderraynı hedefe yönlendirin .stdoutsomefile

Bu son durumda hem stderrve stdoutgitmek somefileistediğini muhtemelen olan.


4
cat file1 file2 1> file.txt 2>&1

>& Aslında yinelenen anlamına gelir, önceden açılmış bir dosyaya yeni bir dosya tanıtıcısını eşlemek için dup sistem çağrısını kullanır.

Bu nedenle, önce (aslında bash) önce yeni stdout'u açmalısınız, "ve stderr'i ayarlanmış olan stdout'a yönlendirin" deyin.


bu harika! bunu merak ediyordum &. bu sözdizimine bazı referanslar ekleyebilir misiniz, veya - daha iyisi - yukarıda belirtilen dup sistemi hakkında bazı iyi kaynaklar?
Eliran Malka

1
'adam dup' sistem çağrısını belgeler.
X Tian

mantıklı :) thanx
Eliran Malka
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.