Apa yang mengilhami pertanyaan ini adalah bahwa saya sedang menguji fungsionalitas perangkat pengawas dan saya berpikir jika ada perintah bawaan shell untuk membuka perangkat dan tidak melakukan apa pun/menunggu sampai dihentikan?Echo/touch
tampaknya hanya membuka dan menutup perangkat segera setelah melakukan operasi. Cat
sepertinya tidak berhasil.
Saya menggunakan aplikasi C untuk melakukan hal yang sama tetapi bertanya-tanya apakah skrip shell memiliki beberapa ketentuan untuk itu
Jawaban yang Diterima:
Dalam cangkang mirip Bourne,
exec 3< "$device"
Membuka perangkat pada deskriptor file 3 dari shell.
Itu kurang lebih setara dengan C:
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(ksh93
juga melakukan fcntl(3, F_SETFD, FD_CLOEXEC)
di fd itu).
Untuk menutupnya:exec 3<&-
Dalam zsh
, ksh93
dan bash
, setara dengan fd = open(device, O_RDONLY)
dapat juga ditulis sebagai:
exec {fd}< "$device"
Di mana deskriptor file akan menjadi yang pertama gratis di atas 9 dan disimpan di $fd
.
Untuk menutupnya:exec {fd}<&-
Ganti <
dengan >
untuk O_WRONLY|O_CREAT|O_TRUNC
, dan dengan <
untuk O_RDWR|O_CREAT
dan >>
untuk O_WRONLY|O_CREAT|O_APPEND
.
zsh
juga memiliki sysopen
bawaan (dalam zsh/system
module) di mana Anda dapat menentukan flag dengan tepat.
Perhatikan bahwa dalam shell yang sesuai dengan POSIX, exec
menjadi bawaan khusus , jika file tidak dapat dibuka, itu adalah kesalahan fatal ketika non-interaktif (keluar dari skrip). Anda dapat menonaktifkannya dengan menggunakan command
perintah.
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi