Urutan pengalihan

29

Saya tidak begitu mengerti bagaimana komputer membaca perintah ini.

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

Jika saya mengerti, 2>&1cukup arahkan Kesalahan Standar ke Output Standar.

Dengan logika itu, perintah itu berbunyi bagi saya sebagai berikut:

  1. menggabungkan file file1dan file2.

  2. kirim stdoutdari operasi ini ke file.txt.

  3. kirim stderrke stdout.

  4. akhir?

Saya tidak yakin apa yang dilakukan komputer. Menurut logika saya, seharusnya perintah itu

cat file1 file2 2>&1 > file.txt

tetapi ini tidak benar.

iDontKnowBetter
sumber

Jawaban:

46

Saya merasa lebih mudah untuk memikirkan menggunakan tugas.

  • > seperti =
  • & seperti $

Anda mulai dengan

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

maka contoh pertama Anda 1> file.txt 2>&1,, apakah

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

meninggalkanmu

1 = file.txt
2 = file.txt

Jika Anda melakukannya dengan cara lain, sekali lagi Anda mulai dengan

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

maka 2>&1 > file.txttidak

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

jadi hasil akhirnya adalah

1 = file.txt
2 = /dev/tty

dan Anda hanya dialihkan stdout, tidak stderr.

Mikel
sumber
saya semacam mendapatkan analogi, tetapi membingungkan - apa artinya $?
Eliran Malka
Dalam penugasan seperti var=$othervar, $perkenalkan nama variabel di sisi kanan. Dalam pengalihan seperti 2>&1, &memperkenalkan nomor deskriptor file di sisi kanan. Saya mengatakan Anda dapat menganggapnya seperti "file 2 sama dengan file 1". (Tapi ada dua jenis yang sama: <berarti "untuk membaca" dan >berarti "untuk menulis".)
Mikel
12

Urutan pengalihan penting, dan harus dibaca dari kiri ke kanan .

Sebagai contoh: command 2>&1 >somefileberarti:

  1. Redirect stderr(yaitu 2) ke tujuan saat inistdout (pada titik ini, terminal).
  2. Kemudian ubah stdoutuntuk pergi ke somefile.

Jadi dalam hal ini, stderrpergi ke terminal, dan stdoutpergi ke file, yang bukan apa yang Anda inginkan.

Di sisi lain, command >somefile 2>&1berarti:

  1. Redirect stdoutkesomefile
  2. Kemudian arahkan stderrke tujuan yang sama dengan stdout( somefile).

Dalam kasus terakhir ini keduanya stderrdan stdoutpergi ke somefile, yang mungkin apa yang Anda inginkan.

Amelio Vazquez-Reina
sumber
4
cat file1 file2 1> file.txt 2>&1

>& Sebenarnya berarti duplikat, ia menggunakan panggilan sistem dup untuk memetakan deskriptor file baru ke file yang sudah dibuka.

Jadi, Anda (sebenarnya bash) harus terlebih dahulu membuka stdout baru sebelumnya, dengan mengatakan "dan mengarahkan stderr ke stdout apa pun yang saat ini disetel."

X Tian
sumber
ini luar biasa! Saya bertanya-tanya tentang itu &. dapatkah Anda menyertakan beberapa referensi ke sintaks itu, atau - lebih baik lagi - beberapa sumber yang bagus pada sistem dup yang disebutkan di atas?
Eliran Malka
1
'man dup' mendokumentasikan panggilan sistem.
X Tian
masuk akal :) thanx
Eliran Malka