Рейтинг:0

Функция Bash, определенная в .bashrc, недоступна для других скриптов.

флаг vn

Я часто выполняю эту команду.

load_module виртуоз

В терминале работает нормально.

Поэтому я поместил его в сценарий bash с именем load.sh, который является исполняемым.

    #!/бин/баш
    эхо "Привет"
    load_module виртуоз

но когда я пытаюсь выполнить его с помощью ./load.sh, это дает эту ошибку,

./load.sh: строка 3: load_module: команда не найдена

Я попытался отладить его, поставив эхо "привет" в файле load.sh. Он печатает Привет на экране, когда я запускаю файл, поэтому, я думаю, скрипт работает нормально. Я не думаю о том, что еще попробовать. Спасибо

Вот резюме.

een212023@hertz:~/iec_lab1$ ls -la load.sh
-rwxr-xr-x 1 een212023 nogroup 46 авг 19 17:59 load.sh
een212023@hertz:~/iec_lab1$ кот load.sh
#!/бин/баш
эхо "Привет"
load_module виртуоз
een212023@hertz:~/iec_lab1$ load_module виртуозно
een212023@hertz:~/iec_lab1$ ./load.sh
Привет
./load.sh: строка 3: load_module: команда не найдена
een212023@hertz:~/iec_lab1$



een212023@hertz:~/iec_lab1$ тип -a load_module
load_module — это функция
загрузочный_модуль ()
{
    если уже загружено $1; тогда
        вернуть 0;
    фи;
    load_vars_of_module $1;
    объявить -a required_here = ("${additional_required[@]}");
    объявить -a конфликты_здесь=("${дополнительные_конфликты[@]}");
    load_required_modules ${required_here[*]};
    unload_conflicting_modules ${conflicts_here[*]};
    load_vars_of_module $1;
    init_all_paths;
    add_paths ${дополнительный_путь[*]};
    add_ldpaths ${дополнительный_ldpath[*]};
    add_manpaths ${дополнительный_manpath[*]};
    add_lmpaths ${дополнительный_lmpath[*]};
    переменные экспорта ${additional_exports[*]};
    новые псевдонимы "${дополнительные_алиасы[@]}";
    отключить ${!дополнительно*};
    экспорт МОДУЛИ=${МОДУЛИ}:$1
}
Byte Commander avatar
флаг nf
Что такое `load_module`? Можете ли вы добавить вывод `type -a load_module` к вашему вопросу, пожалуйста? Если это, например. псевдоним, он не будет доступен в сценариях.
Rahul avatar
флаг vn
@ByteCommander Я добавил вывод «type -a load_module»
Byte Commander avatar
флаг nf
Посмотрите https://unix.stackexchange.com/q/63665/103151 - если вы определяете функцию оболочки, например. в вашем файле .bashrc это не будет доступно для скриптов, только для вашей интерактивной оболочки. Вместо этого вы можете преобразовать функцию в отдельный сценарий или, например, скопировать ее в свой новый сценарий.
sourav c. avatar
флаг cn
Вот почему существует «экспорт».
Rahul avatar
флаг vn
@souravc. Я добавил `export -f load_module` в свой файл `load.sh`, но при выполнении он говорит: `load_module: не функция`
Byte Commander avatar
флаг nf
Вам нужно экспортировать функцию там, где она определена, а не там, где вы хотите ее загрузить. Но если я правильно понимаю сообщение, на которое я ссылаюсь, в зависимости от того, где вы его определяете, этот файл все равно может не загружаться для сценариев.
Рейтинг:1
флаг vn

Как уже говорили другие, вам нужно определить свои функции при загрузке скрипта.

Я делаю это, имея файл сценария, содержащий мои «общие» функции, которые я обычно использую в сценариях. Назовем этот файл /путь/к/bash-common.sh - и в вашем случае этот скрипт будет содержать функцию load_module.

Затем я делаю ссылку на этот общий сценарий во всех других сценариях, поэтому все мои сценарии начинаются так:

#!/бин/баш
источник /путь/к/bash-common.sh

В вашем случае ваш load.sh тогда будет:

#!/бин/баш
источник /путь/к/bash-common.sh

эхо "Привет"
load_module виртуоз

Тогда вы также можете источник /путь/к/bash-common.sh в вашей .bashrc если хотите.

Таким образом, вам нужно только хранить все свои пользовательские функции в одном месте, и они доступны везде, где вы получаете этот файл (в том числе в вашей интерактивной оболочке, если вы используете его в .bashrc).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.