Apa yang dilakukan 'exec {fd} </ dev / watchdog' di Bash

28

Itu harfiah, {fd}bukan pengganti. Saya memiliki skrip yang melakukan ini, dan tidak sumber dalam apa pun, juga tidak referensi {fd} di tempat lain. Apakah ini bash yang valid?

exec {fd}</dev/watchdog

Gregg Leventhal
sumber

Jawaban:

34

Daripada harus memilih deskriptor file dan berharap itu tersedia:

exec 4< /dev/watchdog  # Was 4 in use? Who knows?

notasi ini meminta shell untuk memilih deskriptor file yang saat ini tidak digunakan, buka file untuk membaca deskriptor itu, dan menetapkan nomor ke variabel yang diberikan ( fd).

$ exec {fd}< /dev/watchdog
$ echo $fd
10
chepner
sumber
Saya yakin Anda benar, karena (1) saya ingat pernah membacanya di suatu tempat, dan (2) Saya baru mencobanya (dan berhasil). Tetapi saya tidak dapat menemukannya didokumentasikan di mana pun. (Tentu saja, saya memiliki waktu kurang dari sepuluh menit untuk mencari sebelum Anda memposting jawaban Anda.) Dapatkah Anda memberikan referensi ke tempat itu didokumentasikan?
Scott
2
Lihat halaman manual, paragraf ke-2 dari bagian ini REDIRECTIONS. Itu tidak benar-benar melompat pada Anda, karena mereka tidak memberikan contoh eksplisit.
chepner
Anda benar, saya melewatkannya di bash pria, tapi itu ada di mana Anda berkata. Perlu dicatat bahwa kata apa pun, tidak hanya fd akan bekerja di kawat gigi, dan bahwa ia menetapkan fd> = 10.
Gregg Leventhal
3
@Scott, tidak hanya hanya di bash, tetapi hanya di bash 4.1 atau yang lebih baru (sehingga tidak tersedia pada rilis 3.2 yang masih digunakan pada MacOS).
Charles Duffy
2
@CharlesDuffy /dev/watchdogjuga tidak ada di Mac OS X; ini adalah perangkat khusus Linux.
duskwuff
11

Formulir:

{var}<filename

membuat file shell terbuka filenameuntuk membaca dan menyimpan nomor deskriptor file dalam variabel var. Tidak ada ruang yang diizinkan antara {var}dan operator pengalihan, dan nomor deskriptor file akan lebih besar atau sama 10.

Fitur ini asli dari ksh(dari versi ksh93r pada tahun 2006), bashdisalin jauh kemudian bash-4.1-alphadari tahun 2010. zshJuga membuat perubahan lebih awal bashdari zsh 4.3.4pada tahun 2007.

cuonglm
sumber
2

Ini dijelaskan di bagian manual Bash tentang Pengalihan .

Setiap pengalihan yang dapat didahului dengan nomor deskriptor file sebaliknya dapat didahului oleh kata dari bentuk { varname }. Dalam hal ini, untuk setiap operator redirection kecuali >&-dan <&-, shell akan mengalokasikan deskriptor file lebih besar dari 10 dan menetapkannya ke { varname }. Jika >&-atau <&-didahului oleh { varname }, nilai varname mendefinisikan deskriptor file untuk ditutup.

Barmar
sumber