Ottenere un errore di "reindirizzamento ambiguo"


173

La seguente riga nel mio script Bash

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

mi dà questo errore:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Perché?


10
non stai mostrando tutto. dove hai preso ${OUPUT_RESULTS}. È anche un errore di ortografia se intendevi$OUTPUT_RESULTS}
ghostdog74

se uno ha scritto OUPUT_RESULTS = "filename.log"otterrà un reindirizzamento ambiguo. Perché bash non vuole SPAZIO attorno =all'operatore.
Poutrathor,

Risposte:


270

A volte Bash può essere piuttosto ottuso.

I seguenti comandi restituiscono tutti diversi messaggi di errore sostanzialmente per lo stesso errore:

$ 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

L'aggiunta di virgolette attorno alla variabile sembra essere un buon modo per gestire il messaggio "reindirizzamento ambiguo": si tende a ottenere un messaggio migliore quando si è commesso un errore di battitura e quando l'errore è dovuto agli spazi nel nome del file, usare le virgolette è la soluzione.


1
Lo otterrai anche se reindirizzi l'output di uno script che contiene reindirizzamenti. Non chiedermi come lo so.
Paul Jackson,

@PaulJackson, ... non è vero. Come dimostratore di copia e incolla: sh -c 'echo hello >/tmp/hello' >/tmp/worldfunziona correttamente.
Charles Duffy,

24

Hai una variabile chiamata OUPUT_RESULTSo è più probabile 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$ 

2
Se il tuo ABC="junk file.txt", questo avrebbe ancora il problema.
Charles Duffy,

15

inserisci le virgolette intorno alla tua variabile. Se capita di avere spazi, ti darà anche un "reindirizzamento ambiguo". controlla anche l'ortografia

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

ad esempio di reindirizzamento 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

1
Le citazioni non contano. Se ci sono spazi nell'espansione variabile, otterrai solo cose che vanno al file sbagliato e / o messaggi di errore spuri che coinvolgono la parte post-spazio del nome del file.
SOLO IL MIO OPINIONE corretta,

@JUSTMYcorrectOPINION, la shell non analizza nuovamente dopo l'espansione dei parametri, il che significa che il contenuto dopo lo spazio all'interno dei risultati dell'espansione non può comportare la compilazione di una diversa sintassi.
Charles Duffy

5

Recentemente ho scoperto che gli spazi vuoti nel nome del file di reindirizzamento causeranno il messaggio "reindirizzamento ambiguo".

Ad esempio, se si reindirizza a application$(date +%Y%m%d%k%M%S).loge si specificano i caratteri di formattazione errati, il reindirizzamento non riuscirà prima delle 10 di mattina, ad esempio. Se tuttavia, lo avessi usato application$(date +%Y%m%d%H%M%S).log, avrebbe avuto successo. Questo perché il %kformato produce ' 9'per 9AM dove %Hproduce '09'per 9AM.

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

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

La data errata potrebbe dare qualcosa del tipo:

echo "a" > myapp20140626 95138.log

dove sarebbe ciò che si desidera:

echo "a" > myapp20140626095138.log

L'errore è che dovresti avere delle virgolette attorno alla variabile, indipendentemente dal fatto che contenga spazi. Vedi Quando avvolgere le virgolette attorno a una variabile di shell?
Tripleee,

5

Il percorso specificato in $ {OUPUT_RESULTS} contiene caratteri bianchi? In tal caso, ti consigliamo di utilizzare... >> "${OUPUT_RESULTS}" (utilizzando le virgolette).

(Potresti anche considerare di rinominare la tua variabile in ${OUTPUT_RESULTS})


1

Ho appena avuto questo errore in uno script bash. Il problema era un \ accidentale alla fine della riga precedente che stava dando un errore.


1

Un'altra cosa che può causare "reindirizzamento ambiguo" è anche \t \n \rnel nome della variabile che stai scrivendo

Forse no \n\r? Ma errare con cautela

Prova questo

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

Mi è stato colpito con questo mentre analizzavo HTML, Tabs \tall'inizio della riga.



1

Se il reindirizzamento dello script contiene una variabile e il corpo dello script definisce quella variabile in una sezione racchiusa tra parentesi, verrà visualizzato l'errore "reindirizzamento ambiguo". Ecco un esempio riproducibile:

  1. vim a.sh per creare lo script
  2. modifica script per contenere (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh per renderlo eseguibile
  4. a.sh

Se lo fai, otterrai "/home/ubuntu/a.sh: linea 1: $ logit: reindirizzamento ambiguo". Questo è perché

"Il posizionamento di un elenco di comandi tra parentesi provoca la creazione di una subshell e ciascuno dei comandi nell'elenco viene eseguito in quella subshell, senza rimuovere le variabili non esportate. Poiché l'elenco viene eseguito in una subshell, le assegnazioni delle variabili non rimangono in effetti dopo il completamento della subshell. "

Dal Utilizzando le parentesi per raggruppare ed espandere le espressioni

Per correggere ciò, è possibile modificare lo script nel passaggio 2 per definire la variabile al di fuori della parentesi: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

se si utilizza un nome variabile nel comando shell, è necessario concatenarlo con +segno.

per esempio :

se hai due file e non intendi codificare il nome del file, invece vuoi usare il nome della variabile
"input.txt" = x
"output.txt" = y

quindi ('comando shell tra virgolette' + x> + y)

funzionerà in questo modo specialmente se lo stai usando all'interno di un programma Python con il comando os.system probabilmente


0

Anche questo potrebbe essere il caso.

non hai specificato il file in una variabile e reindirizzando l'output su di esso, quindi bash genererà questo errore.

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 variabile out_file non è impostata correttamente, quindi tieni d'occhio anche questo. A proposito questo codice sta stampando tutto il contenuto e il suo nome file sulla console.


0

Ho riscontrato questo errore durante il tentativo di utilizzare l'espansione del controvento per scrivere l'output su più file.

per esempio: echo "text" > {f1,f2}.txtrisultati in-bash: {f1,f2}.txt: ambiguous redirect

In questo caso, utilizzare teeper l'output in più file:

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

il 1>/dev/nullimpedirà il testo venga scritto stdout

Se si desidera aggiungere al file utilizzare tee -a

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.