> & [FILE_DESCRIPTOR] vs> & operator pengalihan bash file

Oct 16 2020

Saya telah membaca tentang pengalihan bash, dan menemukan dua artikel tentangnya

  • pertama :

    https://www.brianstorti.com/understanding-shell-script-idiom-redirect

    menyatakan itu

    Anda dapat menggunakan & [FILE_DESCRIPTOR] untuk merujuk nilai deskriptor file;

    Namun ketika saya membacanya bersamaan dengan artikel kedua

  • yang ke dua

    https://catonmat.net/bash-one-liners-explained-part-three

    itu menyatakan itu

    Perhatikan juga bahwa dalam bash, menulis ini:

    $ command &>file
    

    Persis sama dengan:

    $ command >&file
    

    Namun, bentuk pertama lebih disukai.

kenapa >&filemembuat filedeskriptor file

Jawaban

4 StéphaneChazelas Oct 16 2020 at 12:10

Ini sebenarnya adalah dua operator berbeda yang saling bertentangan, satu dari shell Bourne, satu dari shell C.

cmd >&2

Kependekan dari

cmd 1>&2

Apakah operator Bourne shell yang berjalan cmddengan stdout (fd 1) terhubung ke sumber yang sama ( deskripsi file terbuka yang sama ) seperti pada fd 2 ( x>&y(atau x<&yyang persis sama) mengalihkan fd x ke sumber yang sama seperti pada fd y ).

cmd >& file

Apakah cshoperator C shell ( ) yang berjalan cmddengan fd 1 dan 2-nya terhubung ke deskripsi file terbuka baru yang diperoleh dengan membuka filemode hanya tulis. Dalam sintaks Bourne shell, padanannya adalahcmd > file 2>&1

Mereka melakukan konflik. Mana yang benar-benar digunakan bergantung pada apakah targetnya numerik atau tidak.

Jika Anda memiliki:

cmd >&"$file"

Operator Bourne shell akan digunakan jika $fileberisi urutan angka desimal dan operator C shell akan digunakan sebaliknya!

Itulah mengapa lebih baik menghindari operator csh itu dan > file 2>&1sebagai gantinya gunakan sintaks Bourne shell ( ).

bash(dan zsh) juga memiliki &>operator sebagai alternatif >&, tetapi perhatikan bahwa ini melanggar kepatuhan POSIX seperti cmd &> fileyang dimaksudkan untuk dijalankan cmd &dan kemudian > filedi POSIX sh. Namun tidak ada masalah konflik yang disebutkan di atas.