Dans le shell Unix, j'ai un fichier env (le fichier env définit les paramètres requis pour exécuter le script utilisateur comme le nom et le chemin du fichier journal, redirige les sorties et les erreurs vers le fichier journal, les détails de connexion à la base de données, etc. ) qui redirige toutes les sorties ( messages d'écho ) et les erreurs dans le fichier journal à partir du script exécuté à l'aide du code suivant:
exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}
Le fichier env est exécuté au début de chaque script. En raison du code ci-dessus dans le fichier env, toutes les sorties de la console qui pourraient être des sorties utilisateur ou des erreurs sont directement sorties dans le fichier journal, ce dont j'avais réellement besoin.
Mais il existe des sorties utilisateur sélectives que je souhaite afficher à la fois dans la console et dans le fichier journal. Mais à cause du code ci-dessus, je ne suis pas en mesure de le faire.
Je sais que si je supprime le code ci-dessus, je peux obtenir le résultat souhaité dans ce cas, mais je devrai écrire manuellement toutes les autres sorties dans le fichier journal, ce qui n'est pas une tâche facile.
Existe-t-il un moyen d'obtenir la sortie à la fois dans la console et dans le fichier journal sans supprimer les codes ci-dessus?
/dev/fd/3
est un nom de fichier qui fait référence à "le fd 3 actuellement ouvert", donctee /dev/fd/3
écrira tout ce qui arrive sur son stdin dans fd 1 et aussi fd 3 (le/dev/fd/3
fichier). Fd 1 est connecté au fichier journal, fd 3 est connecté à la console.echo "blah" | tee file1.txt | tee file2.txt >/dev/null
'Blah' ne sera pas mis dans file1.txt & file2.txt, mais pas écrit sur la console.tee
, qui à son tour écrit sur le terminal) plutôt que d'aller directement vers un terminal, et d'ajuster leur sortie pour correspondre.Oui, vous souhaitez utiliser
tee
:Dirigez simplement votre commande vers le tee et passez le fichier comme argument, comme ceci:
Cela imprime à la fois la sortie sur le STDOUT et écrit la même sortie dans un fichier journal. Voir
man tee
pour plus d'informations.Notez que cela n'écrira pas stderr dans le fichier journal, donc si vous souhaitez combiner les deux flux, utilisez:
la source
script.sh: line 5: exec: 1: not found
J'ai essayé la réponse de Joonty, mais j'ai aussi
Erreur. C'est ce qui fonctionne le mieux pour moi ( confirmé pour fonctionner également dans zsh):
Le fichier /tmp/both.log contient ensuite
Le fichier /tmp/both.log est ajouté à moins que vous ne supprimiez le -a du tee.
Allusion:
>(...)
est une substitution de processus. Il laisse passerexec
latee
commande comme s'il s'agissait d'un fichier.la source
exec > >(tee ${LOG_FILE}) 2>&1
.Je voulais afficher les journaux sur stdout et le fichier journal avec l'horodatage. Aucune des réponses ci-dessus n'a fonctionné pour moi. J'ai utilisé la substitution de processus et la commande exec et j'ai trouvé le code suivant. Exemples de journaux:
Ajoutez les lignes suivantes en haut de votre script:
J'espère que cela aide quelqu'un!
la source
pour le fichier journal, vous pouvez dater de saisir des données texte. le code suivant peut aider
sortie: 2. Le fichier journal sera créé lors de la première exécution et continuera à être mis à jour à partir des prochaines exécutions. En cas de fichier journal manquant lors de l'exécution future, le script créera un nouveau fichier journal.
la source
J'ai trouvé un moyen d'obtenir le résultat souhaité. Bien que ce soit de manière quelque peu peu orthodoxe. Quoi qu'il en soit, c'est parti. Dans le fichier redir.env, j'ai le code suivant:
Ensuite, dans le script réel, j'ai les codes suivants:
Ici, les sorties d' écho uniquement vers la console, les sorties de journaux uniquement vers le fichier journal et les sorties de messages vers le fichier journal et la console.
Après avoir exécuté le fichier de script ci-dessus, j'ai les sorties suivantes:
Dans la console
Pour le fichier journal
J'espère que cette aide.
la source
Essayez ceci, cela fera le travail:
la source
exec > >(tee -a ${log_file} )
fonctionne parfaitement pour mes besoins. Les solutions précédentes ci-dessus interrompraient des parties de mon script qui forceraient la sortie en cas d'échec. Mercila source
Je trouve très utile d'ajouter à la fois stdout et stderr à un fichier journal. J'étais content de voir une solution par alfonx avec
exec > >(tee -a)
, car je me demandais comment accomplir cela en utilisantexec
. Je suis tombé sur une solution créative utilisant la syntaxe here-doc et.
: /unix/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell -scénarioJ'ai découvert que dans zsh, la solution here-doc peut être modifiée en utilisant la construction "multios" pour copier la sortie à la fois vers stdout / stderr et le fichier journal:
Elle n'est pas aussi lisible que la
exec
solution mais elle a l'avantage de vous permettre de ne consigner qu'une partie du script. Bien sûr, si vous omettez l'EOF, tout le script est exécuté avec la journalisation. Je ne sais pas commentzsh
implémente multios, mais il peut avoir moins de frais généraux quetee
. Malheureusement, il semble que l'on ne puisse pas utiliser multios avecexec
.la source