Bash: синтаксическая ошибка: перенаправление неожиданно

70

Я делаю это в script:

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.

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

  • 0
    Для справки, команда работает и на cygwin (/ bin / bash --version GNU bash, версия 3.2.49 (23) -релиз (i686-pc-cygwin) Copyright (C) 2007 Free Software Foundation, Inc.)
Теги:

6 ответов

120
Лучший ответ

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

  • 1
    Есть ли способ исправить это легко?
  • 12
    @Sliq, да используйте !#/bin/bash Bin !#/bin/bash .
Показать ещё 4 комментария
4

Docker:

Я получал эту проблему из своего файла Docker, как и у меня:

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

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

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

+ > Примечание: + > Чтобы использовать другую оболочку, отличную от '/bin/sh', используйте форму exec + > , проходящей в нужной оболочке. Например, + > RUN ["/bin/bash", "-c", "echo hello"]+ Кэш для инструкций RUN автоматически не отменяется во время следующей сборки. Кэш для команды типа RUN apt-get dist-upgrade -y будет использоваться повторно во время следующей сборки. Кэш для

Решение:

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

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

2

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

direc=$(basename `pwd`)

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

$ direc=${PWD##*/}
1

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

0

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

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню