Obteniendo un error de "redirección ambigua"

173

La siguiente línea en mi script Bash

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

me da este error:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

¿Por qué?

Abre el camino
fuente
10
No lo estás mostrando todo. ¿de dónde sacaste ${OUPUT_RESULTS}. También es un error ortográfico si quisiste decir$OUTPUT_RESULTS}
ghostdog74
si uno escribió OUPUT_RESULTS = "filename.log", obtendrá una redirección ambigua. Porque bash no quiere ESPACIO alrededor del =operador.
Poutrathor

Respuestas:

269

Bash puede ser bastante obtuso a veces.

Todos los siguientes comandos devuelven diferentes mensajes de error para básicamente el mismo error:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

Agregar comillas alrededor de la variable parece ser una buena manera de lidiar con el mensaje de "redirección ambigua": tiende a obtener un mejor mensaje cuando ha cometido un error de escritura y cuando el error se debe a espacios en el nombre del archivo, Usar comillas es la solución.

Brent Bradburn
fuente
1
También obtendrá esto si redirige la salida de un script que contiene redireccionamientos. No me preguntes cómo sé esto.
Paul Jackson
@PaulJackson, ... eso no es cierto. Como demostrador de copiar y pegar: sh -c 'echo hello >/tmp/hello' >/tmp/worldfunciona correctamente.
Charles Duffy el
24

¿Tiene una variable llamada OUPUT_RESULTSo es la más probable OUTPUT_RESULTS?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 
SOLO MI OPINIÓN correcta
fuente
2
Si su ABC="junk file.txt", esto todavía tendría el problema.
Charles Duffy el
15

pon comillas alrededor de tu variable. Si tiene espacios, también le dará una "redirección ambigua". también revisa tu ortografía

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

por ejemplo, de redireccionamiento ambiguo

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag
ghostdog74
fuente
1
Las citas no importan. Si hay espacios en la expansión de variables, simplemente obtendrá cosas que van al archivo incorrecto y / o mensajes de error espurios que involucran la parte posterior al espacio del nombre del archivo.
SOLO MI OPINIÓN correcta
@JUSTMYcorrectOPINION, la cáscara no vuelve a análisis sintáctico después de expansiones de parámetros - lo que significa que los contenidos después del espacio dentro de los resultados de expansión no pueden resultar en una pieza diferente de la sintaxis de ser rellenado.
Charles Duffy
5

Recientemente descubrí que los espacios en blanco en el nombre del archivo de redireccionamiento causarán el mensaje de "redirección ambigua".

Por ejemplo, si redirige application$(date +%Y%m%d%k%M%S).logy especifica los caracteres de formato incorrectos, la redirección fallará antes de las 10 AM, por ejemplo. Sin embargo, si application$(date +%Y%m%d%H%M%S).loglo usaste tendría éxito. Esto se debe a que el %kformato rinde ' 9'para las 9 a.m., donde %Hrinde '09'para las 9 a.m.

echo $(date +%Y%m%d%k%M%S) da 20140626 95138

echo $(date +%Y%m%d%H%M%S) da 20140626095138

La fecha errónea podría dar algo como:

echo "a" > myapp20140626 95138.log

donde lo siguiente es lo que se desearía:

echo "a" > myapp20140626095138.log
AixNPanes
fuente
El error es que debe tener comillas alrededor de la variable, independientemente de si contiene espacios. ¿Ver cuándo ajustar las comillas alrededor de una variable de shell?
tripleee
5

¿La ruta especificada en $ {OUPUT_RESULTS} contiene algún espacio en blanco? Si es así, puede considerar usar ... >> "${OUPUT_RESULTS}"(usando comillas).

(También puede considerar cambiar el nombre de su variable a ${OUTPUT_RESULTS})

Thomas
fuente
1

Acabo de tener este error en un script bash. El problema fue un \ accidental al final de la línea anterior que daba un error.

Wayne Workman
fuente
1

Otra cosa que puede causar "redirección ambigua" está \t \n \ren el nombre de la variable que está escribiendo también

Quizás no \n\r? Pero errar por el lado de la precaución

Prueba esto

echo "a" > ${output_name//[$'\t\n\r']}

Fui golpeado con este mientras analizaba HTML, Tabs \tal comienzo de la línea.

Jim
fuente
El error no está citando la variable. ¿Ver cuándo ajustar las comillas alrededor de una variable de shell?
tripleee
1

Si la redirección de su secuencia de comandos contiene una variable y el cuerpo de la secuencia de comandos define esa variable en una sección encerrada entre paréntesis, obtendrá el error "redirección ambigua". Aquí hay un ejemplo reproducible:

  1. vim a.sh para crear el guión
  2. editar script para contener (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh para hacerlo ejecutable
  4. a.sh

Si hace esto, obtendrá "/home/ubuntu/a.sh: línea 1: $ logit: redirección ambigua". Esto es porque

"Al colocar una lista de comandos entre paréntesis, se crea una subshell y cada uno de los comandos de la lista se ejecuta en esa subshell, sin eliminar las variables no exportadas. Dado que la lista se ejecuta en una subshell, las asignaciones de variables no permanecen en efecto después de que se complete la subshell ".

De Usar paréntesis para agrupar y expandir expresiones

Para corregir esto, puede modificar el script en el paso 2 para definir la variable fuera del paréntesis: logit="/home/ubuntu/test.log" && (echo "a") >> $logit

enarmónico
fuente
0

Si está utilizando un nombre de variable en el comando de shell, debe concatenarlo con +signo.

por ejemplo :

si tiene dos archivos y no va a codificar el nombre del archivo, en su lugar, desea usar el nombre de la variable
"input.txt" = x
"output.txt" = y

entonces ('comando de shell entre comillas' + x> + y)

funcionará de esta manera, especialmente si está utilizando esto dentro de un programa de Python con el comando os.system probablemente

Anusree
fuente
0

Este podría ser el caso también.

no ha especificado el archivo en una variable y redirige la salida a él, entonces bash arrojará este error.

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

La variable out_file no está configurada correctamente, así que esté atento a esto también. Por cierto, este código está imprimiendo todo el contenido y su nombre de archivo en la consola.

Rahul Rajput
fuente
0

Recibí este error al intentar usar la expansión de llaves para escribir la salida en varios archivos.

por ejemplo: echo "text" > {f1,f2}.txtresultados en-bash: {f1,f2}.txt: ambiguous redirect

En este caso, use teepara enviar a múltiples archivos:

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

el 1>/dev/nullevitará que el texto se escriba en stdout

Si desea agregar al archivo (s) use tee -a

espectro
fuente