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.
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.
¿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})
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:
vim a.sh para crear el guión
editar script para contener (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh para hacerlo ejecutable
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 ".
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
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.
${OUPUT_RESULTS}
. También es un error ortográfico si quisiste decir$OUTPUT_RESULTS}
OUPUT_RESULTS = "filename.log"
, obtendrá una redirección ambigua. Porque bash no quiere ESPACIO alrededor del=
operador.Respuestas:
Bash puede ser bastante obtuso a veces.
Todos los siguientes comandos devuelven diferentes mensajes de error para básicamente el mismo error:
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.
fuente
sh -c 'echo hello >/tmp/hello' >/tmp/world
funciona correctamente.¿Tiene una variable llamada
OUPUT_RESULTS
o es la más probableOUTPUT_RESULTS
?fuente
ABC="junk file.txt"
, esto todavía tendría el problema.pon comillas alrededor de tu variable. Si tiene espacios, también le dará una "redirección ambigua". también revisa tu ortografía
por ejemplo, de redireccionamiento ambiguo
fuente
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).log
y especifica los caracteres de formato incorrectos, la redirección fallará antes de las 10 AM, por ejemplo. Sin embargo, siapplication$(date +%Y%m%d%H%M%S).log
lo usaste tendría éxito. Esto se debe a que el%k
formato rinde' 9'
para las 9 a.m., donde%H
rinde'09'
para las 9 a.m.echo $(date +%Y%m%d%k%M%S)
da20140626 95138
echo $(date +%Y%m%d%H%M%S)
da20140626095138
La fecha errónea podría dar algo como:
donde lo siguiente es lo que se desearía:
fuente
¿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}
)fuente
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.
fuente
Otra cosa que puede causar "redirección ambigua" está
\t
\n
\r
en el nombre de la variable que está escribiendo tambiénQuizás no
\n\r
? Pero errar por el lado de la precauciónPrueba esto
Fui golpeado con este mientras analizaba HTML, Tabs
\t
al comienzo de la línea.fuente
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:
vim a.sh
para crear el guión(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
para hacerlo ejecutablea.sh
Si hace esto, obtendrá "/home/ubuntu/a.sh: línea 1: $ logit: redirección ambigua". Esto es porque
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
fuente
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
funcionará de esta manera, especialmente si está utilizando esto dentro de un programa de Python con el comando os.system probablemente
fuente
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.
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.
fuente
Recibí este error al intentar usar la expansión de llaves para escribir la salida en varios archivos.
por ejemplo:
echo "text" > {f1,f2}.txt
resultados en-bash: {f1,f2}.txt: ambiguous redirect
En este caso, use
tee
para enviar a múltiples archivos:el
1>/dev/null
evitará que el texto se escriba en stdoutSi desea agregar al archivo (s) use
tee -a
fuente