Подтвердить что ты не робот

Получение ошибки "двусмысленного перенаправления"

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

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

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

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Почему?

4b9b3361

Ответ 1

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

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

Ответ 3

введите кавычки вокруг вашей переменной. Если у вас есть пробелы, это также даст вам "двусмысленный переадресацию". также проверьте правописание

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

Ответ 4

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

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

Ответ 5

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

Например, если вы перенаправляете на 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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

  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

Ответ 9

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

например:

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

then ('shell command within quotes' + x > + y)

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