Получение ошибки «неоднозначного перенаправления»

173

Следующая строка в моем скрипте Bash

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

дает мне эту ошибку:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Зачем?

Открой путь
источник
10
Вы не показываете все. где вы получите ${OUPUT_RESULTS}. Это также орфографическая ошибка, если вы имели в виду$OUTPUT_RESULTS}
ghostdog74
если кто-то написал, OUPUT_RESULTS = "filename.log"он получит неоднозначное перенаправление. Потому что Bash не хочет пространства вокруг =оператора.
Poutrathor

Ответы:

271

Иногда Bash может быть довольно тупым.

Следующие команды все возвращают разные сообщения об ошибках в основном для одной и той же ошибки:

$ 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

Добавление кавычек вокруг переменной, кажется, является хорошим способом справиться с сообщением «неоднозначного перенаправления»: вы, как правило, получаете лучшее сообщение, когда допустили ошибку при наборе текста - и когда ошибка вызвана пробелами в имени файла, использование кавычек это исправить.

Брент Брэдберн
источник
1
Вы также получите это, если перенаправите вывод скрипта, который содержит перенаправления. Не спрашивайте меня, откуда я это знаю.
Пол Джексон
@ Пол Джексон, ... это не правда. Как копируемый и вставляемый демонстратор: sh -c 'echo hello >/tmp/hello' >/tmp/worldработает правильно.
Чарльз Даффи
24

У вас есть переменная с именем OUPUT_RESULTSили это более вероятно 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
Если ваш ABC="junk file.txt", это все равно будет проблема.
Чарльз Даффи
15

поставить кавычки вокруг вашей переменной. Если в нем есть пробелы, он также даст вам «неоднозначное перенаправление». также проверьте свое правописание

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

например двусмысленного перенаправления

$ 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
ghostdog74
источник
1
Цитаты не имеют значения. Если в расширении переменной есть пробелы, вы просто получите информацию о неправильном файле и / или ложных сообщениях об ошибках, связанных с частью имени файла после пробела.
ПРОСТО МОЕ правильное мнение
@JUSTMYcorrectOPINION, оболочка не выполняет повторный анализ после раскрытия параметров - это означает, что содержимое после пробела в результатах расширения не может привести к заполнению другого фрагмента синтаксиса.
Charles Duffy
5

Недавно я обнаружил, что пробелы в имени файла перенаправления вызовут сообщение «неоднозначное перенаправление».

Например, если вы перенаправляете на application$(date +%Y%m%d%k%M%S).logи указываете неправильные символы форматирования, перенаправление не будет выполнено, например, до 10:00. Тем не менее, если вы использовали application$(date +%Y%m%d%H%M%S).logэто будет успешно. Это потому, что %kформат дает ' 9'9 утра, где %Hдает '09'9 утра.

echo $(date +%Y%m%d%k%M%S) дает 20140626 95138

echo $(date +%Y%m%d%H%M%S) дает 20140626095138

Ошибочная дата может дать что-то вроде:

echo "a" > myapp20140626 95138.log

где следующее - то, что было бы желательно:

echo "a" > myapp20140626095138.log
AixNPanes
источник
Ошибка в том, что вы должны иметь кавычки вокруг переменной, независимо от того, содержит ли она пробелы. См. Когда обернуть кавычки вокруг переменной оболочки?
трипл
5

Содержит ли путь, указанный в $ {OUPUT_RESULTS}, какие-либо пробельные символы? Если это так, вы можете рассмотреть возможность использования ... >> "${OUPUT_RESULTS}"(используя кавычки).

(Вы также можете рассмотреть возможность переименования вашей переменной в ${OUTPUT_RESULTS})

Томас
источник
1

У меня только что была эта ошибка в скрипте bash. Проблема была случайной \ в конце предыдущей строки, которая выдавала ошибку.

Уэйн Уоркман
источник
1

Еще одна вещь, которая может вызвать «неоднозначное перенаправление» - \t \n \rэто имя переменной, которую вы пишете.

Может нет \n\r? Но ошибаться на стороне осторожности

Попробуй это

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

Я получил удар при разборе HTML, Tabs \tв начале строки.

Джим
источник
Ошибка не в кавычках переменной. См. Когда обернуть кавычки вокруг переменной оболочки?
трипл
1

Если редирект вашего скрипта содержит переменную, а тело скрипта определяет эту переменную в разделе, заключенном в круглые скобки, вы получите ошибку «неоднозначного перенаправления». Вот воспроизводимый пример:

  1. vim a.sh создать скрипт
  2. отредактировать скрипт, содержащий (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh сделать его исполняемым
  4. a.sh

Если вы сделаете это, вы получите «/home/ubuntu/a.sh: строка 1: $ logit: неоднозначное перенаправление». Это потому что

«Размещение списка команд в скобках приводит к тому, что создается подоболочка, и каждая из команд в списке выполняется в этой подоболочке без удаления неэкспортированных переменных. Поскольку список выполняется в подоболочке, назначения переменных не сохраняются. после завершения подоболочки ".

От использования скобок для группировки и расширения выражений

Чтобы исправить это, вы можете изменить сценарий на шаге 2, чтобы определить переменную вне скобок: logit="/home/ubuntu/test.log" && (echo "a") >> $logit

энгармонический
источник
0

если вы используете имя переменной в команде оболочки, вы должны объединить ее со +знаком.

например :

если у вас есть два файла, и вы не собираетесь жестко кодировать имя файла, вместо этого вы хотите использовать имя переменной
"input.txt" = x
"output.txt" = y

затем («команда оболочки в кавычках» + x> + y)

это будет работать особенно, если вы используете это внутри программы на python с командой os.system, вероятно,

Анусри
источник
0

Это может быть так.

вы не указали файл в переменной и перенаправили вывод в него, тогда bash выдаст эту ошибку.

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_file установлена ​​неправильно, поэтому следите за этим. Кстати, этот код печатает весь контент и его имя файла на консоли.

Рахул Раджпут
источник
0

Я получил эту ошибку при попытке использовать расширение скобки для записи вывода в несколько файлов.

например: echo "text" > {f1,f2}.txtрезультаты в-bash: {f1,f2}.txt: ambiguous redirect

В этом случае используйте teeдля вывода в несколько файлов:

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

1>/dev/nullпредотвратит текст с записью на стандартный вывод

Если вы хотите добавить в файл (ы), используйте tee -a

спектр
источник