Cuando redirige una lista de comandos que contiene una redirección de exec, parece que el exec> / dev / null todavía no se aplica después, como con:
{ exec >/dev/null; } >/dev/null; echo "Hi"
Se imprime "Hola".
Tenía la impresión de que la {}
lista de comandos no se considera una subshell a menos que sea parte de una tubería, por lo exec >/dev/null
que aún debería aplicarse en el entorno de shell actual en mi mente.
Ahora si lo cambia a:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
no hay salida como se esperaba; el descriptor de archivo 1 sigue apuntando a / dev / null para futuros comandos también. Esto se muestra al volver a ejecutar:
{ exec >/dev/null; } >/dev/null; echo "Hi"
que no dará salida.
Intenté hacer un guión y alinearlo, pero todavía no estoy seguro de qué está sucediendo aquí.
En cada punto de este script, ¿qué está pasando con el descriptor de archivo STDOUT?
EDITAR: Agregar mi salida de strace:
read(255, "#!/usr/bin/env bash\n{ exec 1>/de"..., 65) = 65
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
close(10) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
close(3) = 0
dup2(10, 1) = 1
fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(10) = 0
fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(1, TCGETS, 0x7ffee027ef90) = -1 ENOTTY (Inappropriate ioctl for device)
write(1, "hi\n", 3) = 3
;
Después de todo }
, tiene un parásito que cambia el significado de > /dev/null
no aplicarse a la lista compuesta {}
.
close(10)
. ¿También puede publicar todo el contenido del script en el que ejecutó strace?