La redirección de stderr no funciona en csh

11

Ejecuto el siguiente comando:

pkg_add emacs-23.4,2.tbz 2> output.log

La salida todavía se muestra en la terminal. Cuando presiono , me sale

pkg_add emacs-23.4,2.tbz 2 > output.log

con un espacio antes de la2 .

Originalmente no puse esto. lo intento

pkg_add emacs-23.4,2.tbz > output.log 2>&1

Nuevamente, cuando presiono , se han agregado espacios .

¿Por qué me está pasando esto?

Estoy ejecutando csh en FreeBSD.

gadgetmo
fuente

Respuestas:

12

La redirección 2> no funciona con csh o tcsh.

Use el chshcomando para cambiar su shell a / bin / sh o / usr / local / bin / bash para usar el 2>estilo de redireccionamiento. Nota: No cambie el shell de root a / usr / local / bin / bash

csh y tcsh no pueden redirigir la salida estándar y el error por separado, pero >&redirigirán la salida combinada a un archivo.

Craig
fuente
+1 y ✔. Cambié las conchas usando sh.
gadgetmo
1
@Craig Se está ejecutando pkg_adden FreeBSD, así que supongo que esto es para el usuario raíz (/ bin / csh es el valor predeterminado para root en FreeBSD). En este caso se debe no cambiar la cáscara a / usr / local / bin / bash. / bin / sh es aceptable. También podría simplemente cambiar a otro shell después de iniciar sesión como root.
James O'Gorman el
@ JamesO'Gorman Buena captura Actualicé mi respuesta.
Craig
20

No estoy seguro si está intentando ocultar STDERR o redirigirlo a STDOUT.

Para redirigir STDOUT a un archivo:

pkg_add emacs-23.4,2.tbz > stdout.log

Para redirigir STDOUT y STDERR a un archivo:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

Para redirigir STDOUT a un archivo y ocultar STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

Para redirigir STDOUT a la consola y ocultar STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

Para redirigir STDOUT a la consola y STDERR a un archivo:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

Para redirigir STDOUT a un archivo y STDERR a un archivo:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

EDITAR: La razón por la que esto funciona es que la acción en () ocurre primero; Ergo, si hemos redirigido STDOUT, entonces ya no estará disponible fuera de (). Esto nos deja solo con STDERR, y luego podemos redirigir eso según lo deseado.

nikc
fuente
Hola @nikc, bienvenido a unix.SE. Tu comentario es útil e informativo. Sugeriría editar su respuesta e incluirla allí mismo para que no se pierda tan fácilmente.
Dres
1

Sé cómo hacerlo en Csh, pero usando 2 shells:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

Tal manera permite redirigir solo stderr a file.txt, sin stdout, es decir, lo que quería.

Alexander Samoylov
fuente