Lo que inspiró esta pregunta es que estoy probando la funcionalidad del dispositivo de vigilancia y estaba pensando si hay un comando incorporado de shell para simplemente abrir el dispositivo y no hacer nada/esperar hasta que termine.Echo/touch
parece que simplemente abre y cierra el dispositivo inmediatamente después de realizar la operación. Cat
no parece funcionar.
Estoy usando una aplicación C para hacer lo mismo, pero me preguntaba si el script de shell tiene alguna disposición para ello
Respuesta aceptada:
En caparazones tipo Bourne,
exec 3< "$device"
Abre el dispositivo en el descriptor de archivo 3 del shell.
Eso sería más o menos equivalente a C:
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(ksh93
también hace un fcntl(3, F_SETFD, FD_CLOEXEC)
en ese fd).
Para cerrarlo:exec 3<&-
En zsh
, ksh93
y bash
, el equivalente de fd = open(device, O_RDONLY)
también podría escribirse como:
exec {fd}< "$device"
Donde el descriptor de archivo sería el primero libre arriba de 9 y almacenado en $fd
.
Para cerrarlo:exec {fd}<&-
Reemplazar <
con >
para O_WRONLY|O_CREAT|O_TRUNC
, y con <>
para O_RDWR|O_CREAT
y >>
para O_WRONLY|O_CREAT|O_APPEND
.
zsh
también tiene un sysopen
integrado (en el zsh/system
módulo) donde puede especificar las banderas exactamente.
Tenga en cuenta que en los shells compatibles con POSIX, exec
ser un construido especial , si el archivo no se puede abrir, es un error fatal cuando no es interactivo (sale del script). Puede deshabilitarlo usando el command
comando.
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi