redireccionar stderr a stdout en c shell
csh io-redirection (6)
Cuando ejecuto el siguiente comando en csh, no obtuve nada, pero funciona en bash, ¿hay algún equivalente en csh que pueda redirigir el error estándar a la salida estándar?
xxx 2>&1
Nota: xxx es un comando no válido, solo quiero hacer un error para ver el resultado.
Creo que esta es la respuesta correcta para csh.
xxx >/dev/stderr
Tenga en cuenta que la mayoría de los csh son realmente tcsh en entornos modernos:
rmockler> ls -latr /usr/bin/csh
lrwxrwxrwx 1 root root 9 2011-05-03 13:40 / usr / bin / csh -> / bin / tcsh
usando una declaración incrustada de retroceso para representar esto de la siguiente manera:
echo "`echo ''standard out1''` `echo ''error out1'' >/dev/stderr` `echo ''standard out2''`" | tee -a /tmp/test.txt ; cat /tmp/test.txt
si esto funciona para usted, suba a 1. Las otras sugerencias no funcionan para mi entorno csh.
Qué tal solo
xxx >& /dev/stdout
???
xxx >& filename
O haga esto para ver todo en la pantalla y hacer que vaya a su archivo:
xxx | & tee ./logfile
Me opongo a la respuesta anterior y proporciono la mía. csh
TIENE esta capacidad y así es como se hace:
xxx |& some_exec # will pipe merged output to your some_exec
o
xxx |& cat > filename
o si solo desea combinar flujos (a stdout) y no redirigir a un archivo o some_exec:
xxx |& tee /dev/null
El shell csh
nunca ha sido conocido por su amplia capacidad para manipular manejadores de archivos en el proceso de redirección.
Puede redirigir tanto la salida estándar como el error a un archivo con:
xxx >& filename
pero eso no es lo que buscabas, redirigiendo el error estándar a la salida estándar actual .
Sin embargo, si su sistema operativo subyacente expone la salida estándar de un proceso en el sistema de archivos (como Linux lo hace con /dev/stdout
), puede usar ese método de la siguiente manera:
xxx >& /dev/stdout
Esto forzará tanto la salida estándar como el error estándar para ir al mismo lugar que la salida estándar actual, efectivamente lo que tiene con la redirección bash
, 2>&1
.
Solo tenga en cuenta que esta no es una característica de csh
. Si ejecuta un sistema operativo que no expone la salida estándar como un archivo, no puede usar este método.
Sin embargo, hay otro método. Puede combinar las dos corrientes en una si la envía a una tubería con |&
, entonces todo lo que necesita hacer es encontrar un componente de tubería que escriba su entrada estándar en su salida estándar. En caso de que no sepa algo así, eso es exactamente lo cat
hace el cat
si no le da ningún argumento. Por lo tanto, puede lograr sus fines en este caso específico con:
xxx |& cat
Por supuesto, tampoco hay nada que te bash
ejecutar bash
(suponiendo que esté en el sistema en alguna parte) dentro de un script csh
para darte las capacidades adicionales. Luego puede usar las redirecciones ricas de ese shell para los casos más complejos en los que csh
puede tener dificultades.
Exploremos esto con más detalle. Primero, crea un ejecutable echo_err
que escribirá una cadena en stderr
:
#include <stdio.h>
int main (int argc, char *argv[]) {
fprintf (stderr, "stderr (%s)/n", (argc > 1) ? argv[1] : "?");
return 0;
}
Luego, un script de control test.csh
que lo mostrará en acción:
#!/usr/bin/csh
ps -ef ; echo ; echo $$ ; echo
echo ''stdout (csh)''
./echo_err csh
bash -c "( echo ''stdout (bash)'' ; ./echo_err bash ) 2>&1"
El echo
de PID y ps
es simplemente para que pueda asegurarse de que csh
ejecuta este script. Cuando ejecuta este script con:
./test.csh >test.out 2>test.err
(la redirección inicial está configurada por bash
antes de que csh
comience a ejecutar la secuencia de comandos), y examine los archivos out/err
, verá:
test.out:
UID PID PPID TTY STIME COMMAND
pax 5708 5364 cons0 11:31:14 /usr/bin/ps
pax 5364 7364 cons0 11:31:13 /usr/bin/tcsh
pax 7364 1 cons0 10:44:30 /usr/bin/bash
5364
stdout (csh)
stdout (bash)
stderr (bash)
test.err:
stderr (csh)
Puedes ver que el proceso test.csh
se está ejecutando en el shell C, y que invocar bash
desde allí te da el poder completo de redirección.
Los comandos 2>&1
en bash
permiten redirigir el error estándar a la salida estándar actual (como se desee) sin conocimiento previo de hacia dónde se dirige actualmente la salida estándar.
Como paxdiablo dijo, puedes usar >&
para redirigir tanto stdout como stderr. Sin embargo, si los quiere separados, puede usar lo siguiente:
(command > stdoutfile) >& stderrfile
... como se indica, lo anterior redirigirá stdout a stdoutfile y stderr a stderrfile.