Следующая строка в моей Bash script
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
дает мне эту ошибку:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
Почему?
Следующая строка в моей Bash script
echo $AAAA" "$DDDD" "$MOL_TAG >> ${OUPUT_RESULTS}
дает мне эту ошибку:
line 46: ${OUPUT_RESULTS}: ambiguous redirect
Почему?
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
Добавление котировок вокруг переменной, по-видимому, является хорошим способом справиться с сообщением "неоднозначное перенаправление": вы пытаетесь получить лучшее сообщение, когда вы допустили ошибку ввода, и , когда возникла ошибка для пробелов в имени файла, используя кавычки - это исправление.
У вас есть переменная с именем OUPUT_RESULTS
или она более вероятна OUTPUT_RESULTS
?
[email protected]:~/junk$ ABC=junk.txt
[email protected]:~/junk$ echo "Booger" > $ABC
[email protected]:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
[email protected]:~/junk$
введите кавычки вокруг вашей переменной. Если у вас есть пробелы, это также даст вам "двусмысленный переадресацию". также проверьте правописание
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
Указывает ли путь, указанный в ${OUPUT_RESULTS}, пробельные символы? Если это так, вы можете захотеть использовать ... >> "${OUPUT_RESULTS}"
(используя кавычки).
(Вы также можете рассмотреть возможность переименования переменной в ${OUTPUT_RESULTS}
)
Недавно я обнаружил, что пробелы в имени файла перенаправления вызовут сообщение "неоднозначное перенаправление".
Например, если вы перенаправляете на application$(date +%Y%m%d%k%M%S).log
, и вы указываете неправильные символы форматирования, перенаправление будет работать не раньше 10:00. Если, однако, вы использовали application$(date +%Y%m%d%H%M%S).log
, это получится. Это связано с тем, что формат %k
дает ' 9'
для 9AM, где %H
дает '09'
для 9AM.
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
Еще одна вещь, которая может вызвать "неоднозначную перенаправление", - это \t
\n
\r
в названии переменной, которое вы пишете тоже
Может быть, не \n\r
? Но ошибайтесь на стороне осторожности
Попробуйте это
echo "a" > ${output_name//[$'\t\n\r']}
Я попал в этот момент, когда разбирал HTML, Tabs \t
в начале строки.
У меня была эта ошибка только в bash script. Проблема была случайной\в конце предыдущей строки, которая давала ошибку.
Если ваш скрипт перенаправления содержит переменную, а тело скрипта определяет эту переменную в разделе, заключенном в круглые скобки, вы получите ошибку "неоднозначного перенаправления". Вот воспроизводимый пример:
vim a.sh
для создания скрипта(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
чтобы сделать его исполняемымa.sh
Если вы сделаете это, вы получите "/home/ubuntu/a.sh: строка 1: $ logit: неоднозначное перенаправление". Это потому что
"Размещение списка команд в скобках приводит к тому, что создается подоболочка, и каждая из команд в списке выполняется в этой подоболочке, без удаления неэкспортированных переменных. Поскольку список выполняется в подоболочке, назначения переменных не сохраняются. после завершения подоболочки ".
От использования скобок для группировки и расширения выражений
Чтобы исправить это, вы можете изменить сценарий на шаге 2, чтобы определить переменную вне скобок: logit="/home/ubuntu/test.log" && (echo "a") >> $logit
если вы используете имя переменной в команде оболочки, вы должны объединить ее со знаком +
.
например:
если у вас есть два файла, и вы не собираетесь жестко кодировать имя файла, вместо этого вы хотите использовать имя переменной
"input.txt" = x
"output.txt" = y
then ('shell command within quotes' + x > + y)
это будет работать таким образом, особенно если вы используете это внутри программы на python с командой os.system, вероятно,