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?

Willem
la source

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"
Gilles 'SO- arrête d'être méchant'
la source
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"
se ruer
la source
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
David Baggerman
la source
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.