Estoy tratando de redirigir stderr a stdout y luego a un archivo en un script de inicio, pero cuando introduzco stderr a stdout obtengo el error «Redireccionamiento de salida ambiguo». Stdout por sí solo no da como resultado el error y escribe en el archivo de registro donde indiqué. He intentado lo siguiente

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log & -jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 & 

Se agradecería cualquier consejo.

Comentarios

Respuesta

Si estás ejecutando (t) csh, obtienes Ambiguous output redirect. si intenta configurar dos redirecciones en conflicto:

> echo foo > a > b Ambiguous output redirect. 

En Bash, podría obtener un error similar si usa una matriz con varios elementos en lugar del nombre de archivo:

$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect 

Como se menciona en las respuestas a la redirección stderr no funciona en csh , el operador >& trabaja en (t) csh para redirigir tanto stdout como stderr. 2>&1 es la forma estándar de redirigir stderr al mismo lugar que stdout, pero (t) csh no lo admite. En su lugar, toma la combinación > foo 2>&1 como redirección a foo, un argumento normal 2 y una redirección a 1, y las redirecciones entran en conflicto, por lo que aparece el error.

>& también funciona en Bash y zsh, pero no es una característica estándar.

Respuesta

La segunda entrada debería funcionar bien. El error de «redireccionamiento ambiguo» a veces ocurre si tiene espacios donde no deberían estar o, a la inversa, cuando falta un espacio importante.

Simplificaría su comando para demostrar:

echo "Test" >/tmp/x.txt 2>&1 & 

La parte «> /tmp/x.txt» redirigirá stdout (identificador de archivo # 1). Se permite un espacio entre> y el nombre del archivo (aunque en este contexto sería confuso), pero de lo contrario no debería haber espacios aquí.

El 2> & 1 redirigirá stderr (identificador de archivo 2) a cualquier archivo El identificador 1 va a (que es stdout). Tampoco debe haber espacios aquí.

El & pondrá en segundo plano su tarea. Esto debe estar compensado con un espacio del carácter anterior.

Invertir las dos redirecciones no funciona (aunque echo es una mala elección aquí, ya que no produce salida stderr):

echo "This will not work" 2>&1 >/tmp/x.txt & 

Esto significa:

2>&1 

Redirigir el identificador de archivo 2 a donde va el identificador de archivo 1 (que en este punto sigue siendo la consola)

>/tmp/x.txt 

Redirigir el identificador de archivo 1 a un archivo, pero desde el identificador de archivo 2 (stderr) ya está redirigido en este punto, mantendrá su destino y seguirá yendo a la consola.

El primer comando que escribió es simplemente un error de sintaxis.

echo &>/tmp/x.txt 

Actualización : @Wildcard señaló en los comentarios que esta es una sintaxis válida.

Comentarios

  • The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.. Puede contener el espacio. command >out.txt == command > out.txt
  • Tienes razón; Allí cometí un error. Solucionándolo.
  • " El primer comando que escribió es simplemente un error de sintaxis. " No, es ' s no; es ' la sintaxis preferida de Bash para redirigir tanto stdout como stderr. Vea LESS='+/Redirecting Standard Output and Standard Error' man bash
  • @Wildcard – gracias. ¡Nunca dejo de aprender!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *