Bash: ошибка синтаксиса: непредвиденное перенаправление
Я делаю это в 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.
Почему ошибка?
Ответы
Ответ 1
Имеется ли ссылка script /bin/bash
или /bin/sh
в строке хеширования? Системная оболочка по умолчанию в Ubuntu dash, а не bash, поэтому, если у вас есть #!/bin/sh
, то ваш script будет использовать другую оболочку, чем вы ожидаете. У Dash нет оператора перенаправления <<<
.
Ответ 2
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.
Ответ 3
сделать это проще,
direc=$(basename `pwd`)
Или используйте оболочку
$ direc=${PWD##*/}
Ответ 4
Другая причина ошибки может заключаться в том, что вы выполняете задание cron, которое обновляет рабочую копию subversion, а затем попыталось запустить версию script, которая была в конфликтующем состоянии после обновления...
Ответ 5
В моем случае ошибка заключается в том, что я дважды добавил " → "
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
Ответ 6
На моей машине, если я запускаю script напрямую, по умолчанию используется bash
.
Если я запустил его с помощью sudo
, по умолчанию будет sh
.
Вот почему я столкнулся с этой проблемой, когда использовал sudo
.