Bash: синтаксическая ошибка: перенаправление неожиданно - PullRequest
117 голосов
/ 17 марта 2010

Я делаю это в сценарии:

read direc <<< $(basename `pwd`)

и я получаю:

Syntax error: redirection unexpected

в машине с Ubuntu

/bin/bash --version
GNU bash, version 4.0.33(1)-release (x86_64-pc-linux-gnu)

пока я не получаю эту ошибку на другом компьютере suse:

/bin/bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Почему ошибка?

Ответы [ 9 ]

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

Ваш скрипт ссылается на /bin/bash или /bin/sh в своей строке взрыва хеша? Системная оболочка по умолчанию в Ubuntu - dash , а не bash , поэтому, если у вас #!/bin/sh, тогда ваш сценарий будет использовать другую оболочку, чем вы ожидали. В Dash отсутствует оператор перенаправления <<<.

11 голосов
/ 03 января 2017

Docker:

Я получал эту проблему из моего Dockerfile, как и я:

RUN bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Однако, согласно эта проблема была решена:

Форма exec позволяет избежать разбрасывания оболочки и RUN команды, использующие базовое изображение, которое не содержит /bin/sh.

Примечание

Чтобы использовать другую оболочку, отличную от /bin/sh, используйте форму exec переходя в нужную оболочку. Например,

RUN ["/bin/bash", "-c", "echo hello"]

Решение:

RUN ["/bin/bash", "-c", "bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)"]

Обратите внимание на кавычки вокруг каждого параметра.

3 голосов
/ 18 октября 2018

Если вы используете следующее для запуска скрипта:

sudo sh ./script.sh

Тогда вы захотите использовать следующее:

sudo bash ./script.sh

Причина этого в том, что Bash не является оболочкой по умолчанию для Ubuntu. Так что, если вы используете «sh», то он будет использовать оболочку по умолчанию; который на самом деле Dash. Это произойдет независимо от того, есть ли у вас #!/bin/bash в верхней части вашего скрипта. В результате вам нужно будет явно указать использование bash, как показано выше, и ваш скрипт должен работать с ожидаемым результатом.

Dash не поддерживает перенаправления так же, как Bash.

2 голосов
/ 02 февраля 2018

Вы можете получить вывод этой команды и поместить его в переменную. затем используйте heredoc. например:

nc -l -p 80 <<< "tested like a charm";

можно записать как:

nc -l -p 80 <<EOF
tested like a charm
EOF

и вот так (это то, что вы хотите):

text="tested like a charm"
nc -l -p 80 <<EOF
$text
EOF

Практический пример в busybox в docker контейнере:

kasra@ubuntu:~$ docker run --rm -it busybox
/ # nc -l -p 80 <<< "tested like a charm";
sh: syntax error: unexpected redirection


/ # nc -l -p 80 <<EOL
> tested like a charm
> EOL
^Cpunt!       => socket listening, no errors. ^Cpunt! is result of CTRL+C signal.


/ # text="tested like a charm"
/ # nc -l -p 80 <<EOF
> $text
> EOF
^Cpunt!
2 голосов
/ 17 марта 2010

сделать это проще,

direc=$(basename `pwd`)

Или используйте оболочку

$ direc=${PWD##*/}
1 голос
/ 06 июня 2011

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

0 голосов
/ 23 января 2018

Перед запуском скрипта вы должны проверить первую строку скрипта для интерпретатора.

Например: если сценарии начинаются с / bin / bash, запустите сценарий с помощью приведенной ниже команды "bash script_name.sh"

если скрипт начинается с / bin / sh, запустите скрипт с помощью следующей команды "sh script_name.sh"

. / Sample.sh - это обнаружит интерпретатор из первой строки скрипта и запустится.

Различные дистрибутивы Linux, имеющие разные оболочки по умолчанию.

0 голосов
/ 12 декабря 2017

На моем компьютере, если я запускаю сценарий напрямую, по умолчанию используется bash.

Если я запускаю его с sudo, по умолчанию используется sh.

Вот почему я столкнулся с этой проблемой, когда использовал sudo.

0 голосов
/ 11 мая 2017

В моем случае ошибка в том, что я поставил ">>" дважды

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> >> $LOG_PATH

я просто исправляю это как

mongodump --db=$DB_NAME --collection=$col --out=$BACKUP_LOCATION/$DB_NAME-$BACKUP_DATE >> $LOG_PATH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...