Bad Substition как заставить / bin / bash как оболочку?

У меня есть сценарий, который запускается сторонней средой, которая запускает скрипт с помощью «/ bin / sh».

Есть ли способ из сценария, который я могу заставить использовать bash вместо этого, например, путем обнуления команд в bash <<EOF ... EOF , как это?

 #!/bin/bash bash <<EOF IMPORTS=$(find /home/snowch -type f -name .project) for item in ${IMPORTS[*]}; do IMPORT="$(dirname $item)/" echo $IMPORT done EOF 

  • Кодовые буквы в виде цифр
  • Как сделать текст справки по программам автоматически транслируется через меньше?
  • как найти процент появления слова в файле
  • Создание интерактивной оболочки для команды
  • Как вставить вывод предыдущей команды в текущую командную строку?
  • bash $ (printf "% s \ n") не создает многострочный
  • Почему $ '\ 0' совпадает с ''?
  • Почему `` `буквально не обрабатывается шаблоном?
  • 2 Solutions collect form web for “Bad Substition как заставить / bin / bash как оболочку?”

    Вы можете использовать этот синтаксис, который не требует, чтобы $ был экранирован в отличие от вашей попытки здесь.

     #!/bin/bash bash -c ' IMPORTS=$(find /tmp/foo -type f -name .project) for item in ${IMPORTS[*]}; do IMPORT="$(dirname $item)/" echo $IMPORT done ' 

    Вот более надежный способ (благодаря высказанному Gilles комментарию), который имеет то преимущество, чтобы одинарные кавычки присутствовали во встроенном скрипте:

     #!/bin/bash bash <<"%EOF%" IMPORTS=$(find /tmp/foo -type f -name .project) for item in ${IMPORTS[*]}; do IMPORT="$(dirname $item)/" echo $IMPORT done %EOF% 

    Примечание. Невозможно предотвратить использование человеком другой оболочки, кроме той, которая указана с помощью shebang. Написание сценария портативного сценария (т.е. POSIX) не гарантирует, что он будет работать с /bin/sh на каждой платформе, так как сандард не требует оболочки POSIX для использования этого пути.

    Вы можете проверить из сценария, если bash используется. Если нет, замените текущую оболочку на bash . Если это не удается, прервите скрипт.

     [ -z $BASH ] && { exec bash "$0" "$@" || exit; } 

    Это обеспечило бы выполнение сценария только с помощью bash . (Возможно, вы захотите заменить полный путь к bash в приведенной выше команде.)

    Обратите внимание, что, как указано @Gilles и как указано в следующем комментарии, это должна быть первая строка в скрипте.

    Linux и Unix - лучшая ОС в мире.