Получение ошибки «неоднозначного перенаправления» - PullRequest
147 голосов
/ 17 марта 2010

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

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

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

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Почему?

Ответы [ 8 ]

235 голосов
/ 15 октября 2011

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

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

22 голосов
/ 17 марта 2010

У вас есть переменная с именем <b>OU</b>PUT_RESULTS или она более вероятна <b>OUT</b>PUT_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$ 
14 голосов
/ 17 марта 2010

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

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
5 голосов
/ 26 июня 2014

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

Например, если вы перенаправили на 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
5 голосов
/ 17 марта 2010

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

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

1 голос
/ 13 апреля 2017

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

1 голос
/ 30 ноября 2016

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

Может, нет \n\r? Но ошибка в сторону предостережения

Попробуйте это

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

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

0 голосов
/ 15 апреля 2019

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

  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: неоднозначное перенаправление». Это потому что

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...