Comment arrêter la redirection dans bash


8

J'utilise :

exec >script.log 2>&1

dans mon script pour rediriger toutes les sorties vers un fichier. À la fin du script, je voudrais imprimer un message à l'écran. Comment arrêter la redirection?

Réponses:


12

Vous pouvez rappeler execpour restaurer les descripteurs d'origine. Vous devrez les avoir enregistrés quelque part.

exec 3>&1 4>&2 1>script.log 2>&1
 logged portion 
exec 1>&3 2>&4
echo >&2 "Done"

Dans la partie enregistrée, vous pouvez utiliser les descripteurs d'origine pour une commande en redirigeant vers les descripteurs supplémentaires.

echo "30 seconds remaining" >&3

Vous pouvez également placer la partie consignée de votre script dans une commande composée et rediriger cette commande composée. Cela ne fonctionne pas si vous souhaitez utiliser les descripteurs d'origine dans un piège quelque part dans cette partie redirigée.

{
 logged portion 
} >script.log 2>&1
echo >&2 "Done"

La remarque à propos de l'écho en >&3fait ma solution préférée. Merci encore)!
Willem

6

Utilisez additinal fd 3 et 4 pour stdout et stderr et redirigez simplement 1 et 2 vers eux à la fin de votre script:

exec 3>&1 4>&2
exec >script.log 2>&1

echo "Some code"

exec >&3 2>&4
echo "Done"

Cela renvoie une erreur:exec 3>/dev/stdout 4>/dev/stderr -bash: /dev/stdout: Permission denied
Willem

Cette erreur peut se produire lorsque vous essayez de lancer votre script avec un autre utilisateur. Utilisez-vous votre script via sudo?
rush

Oui, c'est ça: j'ai fait un su sur un autre compte et exécuté le code. Le script que j'écris sera exécuté via sudo, je vais donc rencontrer le même problème là-bas. Y a-t-il une alternative?
Willem

Je crois qu'il existe une solution élégante, malheureusement je connais la seule option, qui peut être absolument inacceptable du point de vue de la sécurité: ajoutez votre utilisateur cible à votre groupe principal d'utilisateurs initial et ajoutez des autorisations d'écriture de groupe pour / proc / self / fd / 1 avant le lancement du script. (ou encore plus vulnérable - faites simplement une autorisation d'écriture temporaire pour tous et supprimez-la juste après la fin du script sans changement de groupe).
rush

1
@Willem Ceci est facilement résolu en utilisant des descripteurs de fichiers au lieu de rouvrir les fichiers, voir ma modification.
Gilles 'SO- arrête d'être méchant'

1

Vous devez d'abord vérifier si vous avez ou non un tty.

if tty -s; then
    echo "Hello, World" > $(tty)
fi

1
Notez que cette façon ne peut pas alimenter la sortie vers un programme externe.
rush

Il n'est pas nécessaire d'utiliser l' ttyutilitaire externe . Vous pouvez rediriger vers l'appareil spécial /dev/tty.
pause jusqu'à nouvel ordre.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.