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!
echo &> foo
. (2) No proporcione comandos de ejemplo que sean asincrónicos si no es necesario. (3) Aprenda sobre las conchas. Hay más de un shell en Unixverse y aceptan diferentes sintaxis de comandos. Aprenda a saber qué shell está utilizando.