Pertanyaan saya adalah tentang pengalihan prioritas adalah bash. Misalkan Anda memiliki perintah:
cmd1 < cmd2 > cmd3
Apakah akan diterjemahkan ke:
(cmd1 < cmd2) > cmd3
Atau
cmd1 < (cmd2 > cmd3)
sumber
Pertanyaan saya adalah tentang pengalihan prioritas adalah bash. Misalkan Anda memiliki perintah:
cmd1 < cmd2 > cmd3
Apakah akan diterjemahkan ke:
(cmd1 < cmd2) > cmd3
Atau
cmd1 < (cmd2 > cmd3)
Standar POSIX menentukan bahwa pengalihan shell dari kiri ke kanan; yaitu, pesanan signifikan:
Konstruk
2>&1
ini sering digunakan untuk mengarahkan kesalahan standar ke file yang sama dengan output standar. Karena pengalihan berlangsung dari awal hingga akhir, urutan pengalihan penting. Sebagai contoh:ls > foo 2>&1
mengarahkan output standar dan kesalahan standar ke file
foo
. Namun:ls 2>&1 > foo
hanya mengarahkan output standar ke file
foo
karena kesalahan standar diduplikasi sebagai output standar sebelum output standar diarahkan ke filefoo
.
bash
beroperasi sesuai dengan bagian standar ini:
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
Adapun perpipaan:
Karena penetapan jalur pipa input standar atau output standar atau keduanya terjadi sebelum redirection, maka dapat dimodifikasi oleh redirection. Sebagai contoh:
$ command1 2>&1 | command2
mengirimkan output standar dan kesalahan standar
command1
ke input standarcommand2
.
ls > foo 2>&1
berarti mengarahkan redirect ke foo lalu mengarahkan redder stderr ke stdout. Jadi ini seharusnya tidak berhasil. Demikian pula perintah kedua harus bekerja. Apa yang kulewatkan di sini?bash
umumnya sesuai dengan POSIX, kecuali dalam situasi yang diuraikan di sini , di manabash
perilaku default berbeda. Untukbash
lebih menyesuaikan diri, Anda dapat menggunakan--posix
opsi ini.ls > foo 2>&1
,, beroperasi seperti ini: pertama, output standar dialihkan kefoo
, kemudian, standard error diarahkan ke output standar, yang sekarang menjadi filefoo
. Contoh keduals 2>&1 > foo
, beroperasi seperti ini: kesalahan standar dialihkan ke output standar sebelum output standar dialihkanfoo
, sehingga kesalahan standar digema secara lokal alih-alih diarahkan ke file.ls 2>&1 >foo
mungkin Anda bisa memikirkannya seperti ini. stderr dari 'ls' dialihkan ke stdout. Ini akan terjadi! Ini akan pergi ke mana stdout saat ini ditugaskan untuk pergi, terlepas dari arahan lebih lanjut terkait dengan stdout .. (karena ini adalah arahan utama / pertama ) .. Kemudian datang arahan lain yang mengatakan bahwa stdout akan pergi ke "foo", dan itu ... Ingat: stderr tidak berubah menjadi benar-benar menjadi stdout .. hanya pergi ke tempat stdout itu ditugaskan pada saat direktif. (mis. terminal)Saya kira juga tidak. Sepasang tanda kurung berarti sub-shell. Tetapi dalam kasus ini, tidak ada sub-shell yang akan dimulai karena pengalihan. Bash memberi makan
cmd2
stdin dan memberi makan stdoutcmd3
.Saya berpikir, maksud Anda kira-kira seperti apa
cmd1 | cmd2 | cmd3
? Karena Andacmd2
dancmd3
biasanya file biasa bukan "cmds".sumber