Een “dubbelzinnige omleiding” -fout

De volgende regel in mijn bash-script

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

geeft me deze fout:

line 46: ${OUPUT_RESULTS}: ambiguous redirect

Waarom?


1, Autoriteit 100%

bash kan soms mooi stom zijn.

De volgende opdrachten geven allemaal verschillende foutmeldingen terug voor in principe dezelfde foutmelding:

$ 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

Citaten toevoegen rond de variabele lijkt een goede manier te zijn om te gaan met het “dubbelzinnige omleiding” -bericht: je hebt de neiging om een ​​beter bericht te krijgen wanneer je een typefout hebt gemaakt – en wanneer de fout verschuldigd is naar spaties in de bestandsnaam, het gebruik van citaten is de oplossing.


2, Autoriteit 9%

Heeft u een variabele genaamd OUPUT_RESULTSof is het des te waarschijnlijker 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$ 

3, Autoriteit 5%

Stel citaten rond uw variabele. Als het toevallig spaties heeft, geeft het ook “dubbelzinnig omleiding”. Controleer ook uw spelling

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

bijvoorbeeld van dubbelzinnige omleiding

$ 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

4, Autoriteit 2%

Bevat het pad dat wordt opgegeven in $ {OUPUT_RESULTEN} Bevat een WhiteSpace-tekens? Zo ja, wilt u misschien overwegen met ... >> "${OUPUT_RESULTS}"(met behulp van offertes).

(Mogelijk wilt u overwegen om uw variabele te hernoemen op ${OUTPUT_RESULTS})


Antwoord 5

Ik had net deze fout in een bash-script. Het probleem was een toevallige \ aan het einde van de vorige regel die een foutmelding gaf.


Antwoord 6

Een ander ding dat een “dubbelzinnige omleiding” kan veroorzaken is \t\n\rin de variabelenaam die u ook schrijft

Misschien niet \n\r? Maar wees voorzichtig

Probeer dit

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

Ik werd hiermee geraakt tijdens het ontleden van HTML, Tabs \taan het begin van de regel.


Antwoord 7

Als de omleiding van uw script een variabele bevat en de hoofdtekst van het script die variabele definieert in een sectie tussen haakjes, krijgt u de foutmelding “dubbelzinnige omleiding”. Hier is een reproduceerbaar voorbeeld:

  1. vim a.shom het script te maken
  2. bewerk script om (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.shom het uitvoerbaar te maken
  4. a.sh

Als je dit doet, krijg je “/home/ubuntu/a.sh: regel 1: $logit: ambigue omleiding”. Dit komt omdat

“Het plaatsen van een lijst met commando’s tussen haakjes zorgt ervoor dat een subshell
worden gemaakt, en elk van de opdrachten in de lijst die daarin moet worden uitgevoerd
subshell, zonder niet-geëxporteerde variabelen te verwijderen. Aangezien de lijst is
uitgevoerd in een subshell, variabele toewijzingen blijven niet van kracht
nadat de subshell is voltooid.”

Van Haakjes gebruiken om uitdrukkingen te groeperen en uit te breiden

Om dit te corrigeren, kunt u het script in stap 2 wijzigen om de variabele buiten de haakjes te definiëren: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


Antwoord 8

Dit kan ook het geval zijn.

je hebt het bestand niet gespecificeerd in een variabele en de uitvoer ernaar omgeleid, dan zal bash deze fout geven.

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

out_filevariabele is niet correct ingesteld, dus houd dit ook in de gaten.
Trouwens, deze code drukt alle inhoud en de bestandsnaam af op de console.


Antwoord 9

Ik kreeg deze foutmelding toen ik accolade-uitbreiding probeerde te gebruiken om uitvoer naar meerdere bestanden te schrijven.

bijvoorbeeld: echo "text" > {f1,f2}.txtresulteert in -bash: {f1,f2}.txt: ambiguous redirect

Gebruik in dit geval teeom naar meerdere bestanden uit te voeren:

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

de 1>/dev/nullvoorkomt dat de tekst naar stdout

wordt geschreven

Als je het bestand(en) wilt toevoegen, gebruik dan tee -a


Antwoord 10

als u een variabelenaam gebruikt in de shell-opdracht, moet u deze samenvoegen met het teken +.

bijvoorbeeld:

als u twee bestanden heeft en u gaat de bestandsnaam niet hard coderen, maar wilt u de variabelenaam gebruiken
"input.txt" = x
"output.txt" = y

dan (‘shell-opdracht tussen aanhalingstekens’ + x > + y)

het zal op deze manier werken, vooral als je dit waarschijnlijk gebruikt in een python-programma met de opdracht os.system


Antwoord 11

In mijn geval was dit een nuttige waarschuwing, omdat de doelvariabele (niet het bestand) verkeerd was gespeld en niet bestond.

echo "ja" >> $doesNotExist

resulterend in

./howdy.sh: line 4: $doesNotExist: ambiguous redirect

Other episodes