Lorsque vous redirigez une liste de commandes contenant une redirection exec, l'exec> / dev / null ne semble pas être appliqué par la suite, comme avec:
{ exec >/dev/null; } >/dev/null; echo "Hi"
"Salut" est imprimé.
J'avais l'impression que la {}
liste de commandes n'est pas considérée comme un sous-shell à moins qu'elle ne fasse partie d'un pipeline, donc elle exec >/dev/null
devrait toujours être appliquée dans l'environnement shell actuel dans mon esprit.
Maintenant, si vous le changez en:
{ exec >/dev/null; } 2>/dev/null; echo "Hi"
il n'y a pas de sortie comme prévu; le descripteur de fichier 1 reste également pointé sur / dev / null pour les futures commandes. Cela est illustré par la réexécution:
{ exec >/dev/null; } >/dev/null; echo "Hi"
qui ne donnera aucune sortie.
J'ai essayé de créer un script et de le structurer, mais je ne sais toujours pas exactement ce qui se passe ici.
À chaque étape de ce script, qu'arrive-t-il au descripteur de fichier STDOUT?
EDIT: Ajout de ma sortie 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
;
après }
, ce qui change le sens de > /dev/null
ne pas s'appliquer à la liste composée {}
après tout.
close(10)
. Pouvez-vous également publier l'intégralité du contenu de votre script sur lequel vous avez exécuté Strace?