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 

  • Аргумент string для integer в bash
  • Запустите команду перед любой командой терминала
  • Сценарии Bash и большие файлы (ошибка): ввод с встроенным чтением из перенаправления дает неожиданный результат
  • Bash: повторить последние команды N
  • вызов bash с опцией -t
  • Почему я должен использовать $ вместо $ ((EXPR))?
  • Удаление определенных слов из имени файла
  • BASH getopts OPTARG undefined
  • 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 и как указано в следующем комментарии, это должна быть первая строка в скрипте.

    Interesting Posts

    GNU Parallel: как ограничить максимальное количество сетевых заданий на хост

    Может ли xxd использоваться для вывода двоичного представления шестнадцатеричного числа, а не строки?

    Переносимость исполняемого файла другой машине Linux

    Windows не отображается во втором мониторе. Debian ATI проприетарные драйверы

    Гнукаш: как суммировать несколько валют в учетной записи заполнителя?

    Преобразование ASCII-8BIT в UTF-8 с использованием OSX '.bash_profile

    В `dmesg | head`, (как) dmesg убивается после 10 строк вывода?

    Ли Linux копирует разрешения файлов NTFS?

    при запуске `udevadm test`:` no db file to read / run / udev / data / + gpio_sw: PA7: Нет такого файла или каталога`

    Как обеспечить, чтобы скрипт bash выполнялся через сеть, не будучи в каталоге / cgi-bin?

    Ubuntu Precise – приостановить клинья GDM – помощь!

    Не удается установить libreoffice на debian sid

    Минимальный дистрибутив Linux для компиляции программ на C

    Как искать файлы поиска и сжимать, если больше 500M

    Приложение не может получать многоадресные пакеты на CentOS 7

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