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.
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.
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})
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:
vim a.sh aby stworzyć skrypt
edytuj skrypt, aby zawierał (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh aby był wykonywalny
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. "
${OUPUT_RESULTS}
. Jest to również błąd w pisowni, jeśli masz na myśli$OUTPUT_RESULTS}
OUPUT_RESULTS = "filename.log"
, otrzyma niejednoznaczne przekierowanie. Ponieważ bash nie chce ŻADNEJ PRZESTRZENI wokół=
operatora.Odpowiedzi:
Bash bywa czasami dość tępy.
Wszystkie poniższe polecenia zwracają różne komunikaty o błędach dla zasadniczo tego samego błędu:
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.
źródło
sh -c 'echo hello >/tmp/hello' >/tmp/world
działa poprawnie.Czy masz zmienną o nazwie,
OUPUT_RESULTS
czy jest to bardziej prawdopodobneOUTPUT_RESULTS
?źródło
ABC="junk file.txt"
, to nadal miałby problem.umieść swoją zmienną w cudzysłowie. Jeśli zdarzy się, że ma spacje, da ci również „niejednoznaczne przekierowanie”. sprawdź także pisownię
np. niejednoznacznego przekierowania
źródło
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).log
i określisz niewłaściwe znaki formatowania, przekierowanie zakończy się niepowodzeniem na przykład przed 10:00. Jeśli jednak skorzystasz zapplication$(date +%Y%m%d%H%M%S).log
tego, odniesiesz sukces. Dzieje się tak, ponieważ%k
format daje wynik' 9'
o 9 rano, gdzie%H
daje'09'
o 9 rano.echo $(date +%Y%m%d%k%M%S)
daje20140626 95138
echo $(date +%Y%m%d%H%M%S)
daje20140626095138
Błędna data może dać coś takiego:
gdzie następujące jest to, co byłoby pożądane:
źródło
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}
)źródło
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.
źródło
Inną rzeczą, która może powodować „niejednoznaczne przekierowanie”, jest
\t
\n
\r
również nazwa zmiennej, którą piszeszMoże nie
\n\r
? Ale błądzić po stronie ostrożnościSpróbuj tego
Uderzyłem w ten podczas parsowania HTML, Tabs
\t
na początku linii.źródło
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:
vim a.sh
aby stworzyć skrypt(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
aby był wykonywalnya.sh
Jeśli to zrobisz, otrzymasz „/home/ubuntu/a.sh: line 1: $ logit: ambiguous redirect”. To dlatego, że
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
źródło
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
będzie działać w ten sposób, szczególnie jeśli używasz tego w programie w Pythonie z poleceniem os.system prawdopodobnie
źródło
Może tak być też.
nie podałeś pliku w zmiennej i przekierowujesz do niego wyjście, wtedy bash wyśle ten błąd.
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.
źródło
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
tee
do wyprowadzenia do wielu plików:1>/dev/null
uniemożliwi tekst przed zapisywane stdoutJeśli chcesz dołączyć do pliku (ów) użyj
tee -a
źródło