shell csh io-redirection

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.