Отримання помилки "неоднозначне перенаправлення"


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"ви отримаєте неоднозначне переспрямування. Тому що Баш хоче НЕ ПРОСТОРІВ навколо =оператора.
Путратор

Відповіді:


269

Баш іноді може бути досить тупим.

Наступні команди повертають різні повідомлення про помилки в основному для однієї і тієї ж помилки:

$ 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
Ви також отримаєте це, якщо будете перенаправляти вихід сценарію, який містить переспрямування. Не питайте мене, як я це знаю.
Пол Джексон

@PaulJackson, ... це неправда. Як демонстратор, який можна скопіювати та вставити: 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

1
Котирування не мають значення. Якщо в змінному розширенні є пробіли, ви просто перейдете до неправильного файлу та / або помилкових повідомлень про помилки, що містять частину після простору імені файлу.
ДАЙТЕ МОЕ правильне ДУМКА

@JUSTMYcorrectOPINION, оболонка не повторно розбирається після розширення параметрів - це означає, що вміст після пробілу в результатах розширення не може призвести до заповнення іншого фрагмента синтаксису.
Чарльз Даффі,

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:00.

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

Помилка полягає в тому, що ви повинні мати лапки навколо змінної, незалежно від того, чи вона містить пробіли. Див. Розділ Коли обгортати лапки навколо змінної оболонки?
tripleee

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на початку рядка.


Помилка не є цитуванням змінної. Див. Розділ Коли обгортати лапки навколо змінної оболонки?
tripleee

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

якщо ви використовуєте ім'я змінної в команді shell, ви повинні з'єднати її зі +знаком.

наприклад :

якщо у вас два файли, і ви не збираєтеся жорстко кодувати ім'я файлу, натомість ви хочете використовувати ім'я змінної
"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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.