Ciò che ha ispirato questa domanda è che sto testando la funzionalità del dispositivo watchdog e stavo pensando se esiste un comando integrato nella shell per aprire il dispositivo e non fare nulla/attendere fino al termine?Echo/touch
sembrano aprire e chiudere il dispositivo subito dopo aver eseguito l'operazione. Cat
non sembra funzionare.
Sto usando un'applicazione C per fare lo stesso, ma mi chiedevo se lo script di shell avesse delle disposizioni per questo
Risposta accettata:
In conchiglie tipo Bourne,
exec 3< "$device"
Apre il dispositivo nel descrittore di file 3 della shell.
Sarebbe più o meno equivalente a C:
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(ksh93
fa anche un fcntl(3, F_SETFD, FD_CLOEXEC)
su quel fd).
Per chiuderlo:exec 3<&-
In zsh
, ksh93
e bash
, l'equivalente di fd = open(device, O_RDONLY)
potrebbe anche essere scritto come:
exec {fd}< "$device"
Dove il descrittore di file sarebbe il primo libero sopra 9 e memorizzato in $fd
.
Per chiuderlo:exec {fd}<&-
Sostituisci <
con >
per O_WRONLY|O_CREAT|O_TRUNC
e con <>
per O_RDWR|O_CREAT
e >>
per O_WRONLY|O_CREAT|O_APPEND
.
zsh
ha anche un sysopen
built-in (in zsh/system
modulo) dove puoi specificare esattamente i flag.
Nota che nelle shell compatibili con POSIX, exec
essendo un incorporato speciale , se il file non può essere aperto, è un errore irreversibile quando non è interattivo (esce dallo script). Puoi disabilitarlo usando il command
comando.
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi