GNU/Linux >> Belajar Linux >  >> Linux

Signifikansi Simbol Panah Dalam Menduplikasi/menutup File Deskriptor Di Bawah Bash?

Saya sedang membaca buku tentang baris perintah Linux di mana penulis tampaknya tidak mengikuti konvensi di manual bash mengenai simbol panah yang digunakan dalam operasi pengalihan. Yaitu, dia selalu menggunakan panah kiri < dalam menduplikasi dan menutup deskriptor file terlepas dari apakah deskriptor adalah input atau output.

Ini contohnya:

exec 3<&0 4<&1 #shouldn't be 4>&1 ?
#...
exec 3<&- 4<&- #shouldn't be 4>&- ?

Halaman manual Bash tidak jelas dalam hal ini, menurutnya, deskriptor file yang menduplikasi/menutup dan memindahkan memiliki sintaks berikut:

#Duplicating and closing (in case word expands to -):
[n]<&word 
[n]>&word

#Moving:
[n]<&digit-
[n]>&digit-

Mereka digambarkan memiliki perilaku yang berbeda hanya jika kita tidak secara eksplisit memberikan n . Tetapi ketika kami melakukannya, apakah itu berarti kami dapat menggunakan formulir ini secara bergantian?

Jawaban yang Diterima:

Tidak masalah karena keduanya 4>&1 dan 4<&1 lakukan hal yang sama:dup2(1, 4) yang merupakan panggilan sistem untuk menduplikasi fd ke yang lain. Fd yang digandakan secara otomatis mewarisi arah I/O dari fd asli. (sama untuk 4>&- vs 4<&- yang keduanya memutuskan untuk close(4) , dan 4>&1- yang merupakan dup2(1, 4) diikuti oleh close(1) ).

Namun, 4<&1 sintaks membingungkan kecuali untuk beberapa alasan fd 1 secara eksplisit terbuka untuk membaca (yang akan lebih membingungkan), jadi dalam pikiran saya harus dihindari.

fd yang digandakan berbagi deskripsi file terbuka yang sama yang berarti mereka berbagi offset yang sama dalam file (untuk jenis file yang masuk akal) dan flag terkait yang sama (mode pengalihan/pembukaan I/O, O_APPEND, dan seterusnya).

Di Linux, ada cara lain untuk menduplikasi sebuah fd (yang sebenarnya bukan duplikasi) dan buat deskripsi file terbuka baru untuk sumber daya yang sama tetapi dengan tanda yang mungkin berbeda.

exec 3> /dev/fd/4

Sementara di Solaris dan mungkin sebagian besar Unices lainnya, itu kurang lebih setara dengan dup2(4, 3) , di Linux, yang membuka sumber daya yang sama seperti yang ditunjukkan oleh fd 4 dari awal.

Itu adalah perbedaan penting, karena misalnya, untuk file biasa, offset fd 3 akan menjadi 0 (awal file) dan file akan terpotong (itulah sebabnya misalnya di Linux Anda perlu menulis tee -a /dev/stderr bukannya tee /dev/stderr ).

Terkait:Bagaimana cara memberitahu Firefox untuk menggunakan perangkat ALSA lain?

Dan mode I/O bisa berbeda.

Menariknya, jika fd 4 menunjuk ke ujung pembacaan pipa, maka fd 3 sekarang menunjuk ke ujung penulisan (/dev/fd/3 berperilaku seperti pipa bernama ):

$ echo a+a | { echo a-a > /dev/fd/0; tr a b; }
b+b
b-b

$ echo a+a | { echo a-a >&0; tr a b; }
bash: echo: write error: Bad file descriptor
b+b

Linux
  1. Trik Bash yang lebih bodoh:Variabel, temukan, deskriptor file, dan operasi jarak jauh

  2. Deskriptor File &Skrip Shell?

  3. Bash:Tidak ada file atau direktori seperti itu?

  1. Bisakah Skrip Bash Dihubungkan ke File?

  2. Basa'?

  3. Melakukan Operasi Tulis Atom Dalam File Di Bash?

  1. Bash Script:Periksa Apakah File Adalah File Teks?

  2. Bagaimana cara mengurai file CSV di Bash?

  3. Utas dan deskriptor file