ksh sur le style BSD UNIX. Comment redirect stderr en tee et un fichier

Une question similaire a été posée ici

Mais ça ne marchera pas pour moi

"shell.ksh" > >(tee here.log ) 2> >(tee err.log) ksh: 0403-057 Syntax error: `>' is not expected. 

cette commande ne redirige pas stderr juste stdop

 "shell.ksh" | tee file.log 2>&1 

Je suis sous AIX sous UNIX similaire à BSD sans extensions GNU et c’est ksh

 ps $$ PID TTY STAT TIME COMMAND 40632390 pts/6 A 0:00 -ksh 

Des gens courts et gentils?

Voici un script d’encapsulation qui devrait faire ce que vous voulez. Je ne peux pas confirmer que cela fonctionne sur AIX ksh, mais cela fonctionne en utilisant sh (AT&T Research) 93u+ 2012-08-01 (le paquet ksh de Debian l’appelle la “version réelle et réelle du shell Korn”). ni sa fourchette mksh ).

Ceci est portable et devrait fonctionner dans tous les shells POSIX.

pipe1 + 2.ksh

 #!/bin/ksh touch err.log here.log # create the logs now so tail -f doesn't complain tail -f here.log & # follow the output we'll pipe to later (run in bg) HERE=$! # save the process ID of this backgrounded process tail -f err.log >&2 & # follow output (as above), pipe output to stderr ERR=$! # save the process ID "$@" > here.log 2> err.log # run given command and pipe stdout and stderr RET=$? # save return value sleep 1 # tail polls at 1/s, so wait one second kill $HERE $ERR # stop following those logs exit $RET # restore the exit code from given command 

Donc, vous l’invoquez comme pipe1+2.ksh shell.ksh (en supposant que les deux commandes sont dans votre chemin).

Voici une version de test de shell.ksh:

 #!/bin/ksh echo this output is stdout 1 echo this output is stderr >&2 echo this output is stdout 2 

et un essai:

 # ksh pipe1+2.ksh ksh shell.ksh this output is stdout 1 this output is stdout 2 this output is stderr # cat here.log this output is stdout 1 this output is stdout 2 # cat err.log this output is stderr 

Une note: parce que tail -f n’est pas instantané, stdout vs stderr sera légèrement hors d’usage. Il ne sera même pas cohérent entre les exécutions, du moins avec un code aussi rapide que l’ echo .

Je doute que votre version de tail supporte, mais GNU tail a un indicateur -s SECONDS qui vous permet de spécifier un intervalle d’interrogation différent en tant que valeur décimale, vous pouvez donc essayer, par exemple, tail -f -s 0.01 … affiché Si votre version de sleep prend également en charge les valeurs décimales, modifiez-la pour correspondre à ce nombre.

(A l’origine, j’avais conçu une réponse compliquée de descripteur de fichier basée sur l’une des “combinaisons plus élaborées” de l’incroyable Csh Programming Considered Harmful , mais cela ne semblait pas fonctionner. Voir les commentaires et / ou la version initiale de cette réponse .)