Pojawia się błąd „niejednoznacznego przekierowania”


173

Poniższy wiersz w moim skrypcie Bash

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

daje mi ten błąd:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Czemu?


10
nie pokazujesz wszystkiego. skąd masz ${OUPUT_RESULTS}. Jest to również błąd w pisowni, jeśli masz na myśli$OUTPUT_RESULTS}
ghostdog74

jeśli ktoś napisał OUPUT_RESULTS = "filename.log", otrzyma niejednoznaczne przekierowanie. Ponieważ bash nie chce ŻADNEJ PRZESTRZENI wokół =operatora.
Poutrathor

Odpowiedzi:


269

Bash bywa czasami dość tępy.

Wszystkie poniższe polecenia zwracają różne komunikaty o błędach dla zasadniczo tego samego błędu:

$ 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

Dodanie cudzysłowów wokół zmiennej wydaje się być dobrym sposobem radzenia sobie z komunikatem „niejednoznaczne przekierowanie”: Zwykle otrzymujesz lepszy komunikat, gdy popełnisz błąd podczas wpisywania - i gdy błąd jest spowodowany spacjami w nazwie pliku, rozwiązaniem jest używanie cudzysłowów.


1
Otrzymasz to również, jeśli przekierujesz wyjście skryptu, który zawiera przekierowania. Nie pytaj mnie, skąd to wiem.
Paul Jackson

@PaulJackson, ... to nieprawda. Jako demonstrator do kopiowania i wklejania: sh -c 'echo hello >/tmp/hello' >/tmp/worlddziała poprawnie.
Charles Duffy

24

Czy masz zmienną o nazwie, OUPUT_RESULTSczy jest to bardziej prawdopodobne 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
Jeśli tak ABC="junk file.txt", to nadal miałby problem.
Charles Duffy

15

umieść swoją zmienną w cudzysłowie. Jeśli zdarzy się, że ma spacje, da ci również „niejednoznaczne przekierowanie”. sprawdź także pisownię

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

np. niejednoznacznego przekierowania

$ 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
Cytaty nie mają znaczenia. Jeśli w rozwinięciu zmiennych są spacje, po prostu pojawią się rzeczy, które trafiają do niewłaściwego pliku i / lub fałszywe komunikaty o błędach, obejmujące część nazwy pliku po spacji.
TYLKO MOJA poprawna OPINIA

@JUSTMYcorrectOPINION, powłoka nie analizuje ponownie po rozwinięciu parametrów - co oznacza, że ​​zawartość po spacji w wyniku rozwinięcia nie może spowodować wypełnienia innego elementu składni.
Charles Duffy

5

Niedawno odkryłem, że puste miejsca w nazwie pliku przekierowań spowodują wyświetlenie komunikatu „niejednoznaczne przekierowanie”.

Na przykład, jeśli przekierowujesz do application$(date +%Y%m%d%k%M%S).logi określisz niewłaściwe znaki formatowania, przekierowanie zakończy się niepowodzeniem na przykład przed 10:00. Jeśli jednak skorzystasz z application$(date +%Y%m%d%H%M%S).logtego, odniesiesz sukces. Dzieje się tak, ponieważ %kformat daje wynik ' 9'o 9 rano, gdzie %Hdaje'09' o 9 rano.

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

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

Błędna data może dać coś takiego:

echo "a" > myapp20140626 95138.log

gdzie następujące jest to, co byłoby pożądane:

echo "a" > myapp20140626095138.log

Błąd polega na tym, że zmienna powinna być otoczona cudzysłowami, niezależnie od tego, czy zawiera spacje. Zobacz Kiedy zawijać cudzysłowy wokół zmiennej powłoki?
tripleee

5

Czy ścieżka określona w $ {OUPUT_RESULTS} zawiera jakieś białe znaki? Jeśli tak, możesz rozważyć użycie ... >> "${OUPUT_RESULTS}"(używając cudzysłowów).

(Możesz również rozważyć zmianę nazwy zmiennej na ${OUTPUT_RESULTS})


1

Właśnie miałem ten błąd w skrypcie bash. Problem polegał na przypadkowym \ na końcu poprzedniego wiersza, który powodował błąd.


1

Inną rzeczą, która może powodować „niejednoznaczne przekierowanie”, jest \t \n \rrównież nazwa zmiennej, którą piszesz

Może nie \n\r? Ale błądzić po stronie ostrożności

Spróbuj tego

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

Uderzyłem w ten podczas parsowania HTML, Tabs \tna początku linii.


Błąd nie powoduje cytowania zmiennej. Zobacz Kiedy zawijać cudzysłowy wokół zmiennej powłoki?
tripleee

1

Jeśli przekierowanie skryptu zawiera zmienną, a treść skryptu definiuje tę zmienną w sekcji ujętej w nawias, zostanie wyświetlony błąd „niejednoznaczne przekierowanie”. Oto powtarzalny przykład:

  1. vim a.sh aby stworzyć skrypt
  2. edytuj skrypt, aby zawierał (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh aby był wykonywalny
  4. a.sh

Jeśli to zrobisz, otrzymasz „/home/ubuntu/a.sh: line 1: $ logit: ambiguous redirect”. To dlatego, że

„Umieszczenie listy poleceń w nawiasach powoduje utworzenie podpowłoki, a każde z poleceń na liście jest wykonywane w tej podpowłoce bez usuwania niewyeksportowanych zmiennych. Ponieważ lista jest wykonywana w podpowłoce, przypisania zmiennych nie pozostają w efekcie po zakończeniu działania podpowłoki. "

Od używania nawiasów do grupowania i rozwijania wyrażeń

Aby to naprawić, możesz zmodyfikować skrypt w kroku 2, aby zdefiniować zmienną poza nawiasami: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

jeśli używasz nazwy zmiennej w poleceniu powłoki, musisz połączyć ją ze +znakiem.

na przykład :

jeśli masz dwa pliki i nie zamierzasz na stałe kodować nazwy pliku, zamiast tego chcesz użyć nazwy zmiennej
"input.txt" = x
"output.txt" = y

następnie ('polecenie powłoki w cudzysłowie' + x> + y)

będzie działać w ten sposób, szczególnie jeśli używasz tego w programie w Pythonie z poleceniem os.system prawdopodobnie


0

Może tak być też.

nie podałeś pliku w zmiennej i przekierowujesz do niego wyjście, wtedy bash wyśle ​​ten błąd.

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

Zmienna out_file nie jest poprawnie skonfigurowana, więc miej na to oko. Przy okazji ten kod wypisuje całą zawartość i nazwę pliku na konsoli.


0

Wystąpił ten błąd podczas próby użycia rozszerzenia nawiasów klamrowych do zapisywania danych wyjściowych do wielu plików.

na przykład: echo "text" > {f1,f2}.txt wyniki w-bash: {f1,f2}.txt: ambiguous redirect

W takim przypadku użyj teedo wyprowadzenia do wielu plików:

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

1>/dev/nulluniemożliwi tekst przed zapisywane stdout

Jeśli chcesz dołączyć do pliku (ów) użyj tee -a

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.