Сценарий в ~/.bashrc работает, когда вручную выполняется, но не иначе

Это довольно странно.
Таким образом, я разработал эту названную вещь SahibLib и это - в основном сценарий, который Вы получаете, это получает набор других сценариев.

Его дерево каталогов похоже на это:

/home
    |- /home/myuser
       |- /home/myuser/sahiblib
          |- sahibload <- executed in ~/.bashrc
          |- sahiblib <- executed by sahibload
          |- modules
             |- core.sls <- problem file
             |- example.sls <- problem file

То, что SahibLib, как предполагается, делает, является источником .sls файлы. Это не делает этого все же.

Это производит корректное сообщение (" [УСПЕХ] Спасибо и до свидания. "), но фактические файлы не получены.

myuser@mypc:~$ slhelp
Invalid command.

Странно, когда я получаю файл вручную, он работает:

myuser@mypc:~$ . ~/.bashrc
[SUCCESS] Thank you and goodbye.
myuser@mypc:~$ slhelp
SahibLib Core Help
...

Мой вопрос, почему сценарий правильно не выполняется в ~/.bashrc?


Обновление: Запись некоторых команд отладки к core.sls, кажется, что файл выполняется отлично. Это добирается в конец файла и возвращает стандартный код выхода. Это делает проблему еще более странной, потому что теперь кажется, что Bash просто игнорирует функциональные определения напрямую. Кроме того, если необходимо видеть core.sls, или любой из файлов, они доступны здесь

2
задан 22 September 2016 в 03:42

1 ответ

Из вашей ссылки , в нижней части этой страницы, я вижу эту строку:

echo "/home/myusername/sahiblib/sahibload" >> ~/.bashrc

Это указывает на то, что при запуске ~/.bashrc будет выполнить sahibload, , а не источник . Это означает, что любые функции, определенные в sahibload, будут потеряны, когда выполнение sahibload завершится и управление вернется к ~/.bashrc.

Если вы хотите, чтобы функции, определенные в sahibload, сохранялись, используйте:

echo ". /home/myusername/sahiblib/sahibload" >> ~/.bashrc

Более простой пример

Давайте рассмотрим этот тестовый файл:

$ cat loader
#!/bin/sh
hello() { echo Hello; }

Перед при выполнении сценария не существует функции hello:

$ hello
bash: hello: command not found

После того, как мы выполним сценарий, по-прежнему нет функции с именем hello:

$ ./loader
$ hello
bash: hello: command not found

В приведенном выше примере loader выполняется так же, как sahibload выполняется в ~/.bashrc.

Теперь давайте возьмем источник loader и заметим, что определение hello сохранилось:

$ . ./loader
$ hello
Hello

sahibload необходимо получить, а не выполнить в ~/.bashrc.

5
ответ дан 2 December 2019 в 01:56

Другие вопросы по тегам:

Похожие вопросы: