Назад | Перейти на главную страницу

Невозможно использовать функции, экспортированные из .bashrc, в сценарии bash

Мой .bashrc файл экспортирует функцию с именем lookup:

lookup() {
  grep -r -ne "$1" * | grep -v "TAGS:" | grep -v "tags:"
}
export -f lookup

Я могу использовать эту функцию в оболочке. Но если я вставлю это в такой сценарий:

#!/bin/bash
lookup "foo"

и запустите сценарий, затем bash сообщает "команда не найдена" для lookup. Некоторое время назад это работало. Я сильно подозреваю, что это перестало работать после обновления безопасности bash в моей системе (возможно, связано с shellshock / bashdoor?) Моя версия bash - 4.1.10 (1) на openSUSE 11.4

Проверьте http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Вызывается не интерактивно

Когда Bash запускается в неинтерактивном режиме, например, для запуска сценария оболочки, он ищет переменную BASH_ENV в среде, расширяет ее значение, если оно появляется там, и использует расширенное значение как имя файла для чтения и выполнения. .

В частности, ни один из ~ / .bashrc, ~ / .profile, ~ / .bash_profile НЕ является источником. ~ / .bashrc вызывается только в том случае, если оболочка является интерактивной оболочкой.

У вас есть несколько вариантов:

  1. явно укажите свой .bashrc

    #!/bin/bash
    . ~/.bashrc
    lookup "foo"
    
  2. запустить bash с интерактивным флагом

    #!/bin/bash -i
    lookup "foo"
    
  3. установите переменную BASH_ENV при запуске скрипта:

    BASH_ENV=$HOME/.bashrc /path/to/my/script