выполнить скрипт bash внутри .bashrc

Привет, мне любопытно, можно ли запустить скрипт bash внутри bash rc. Казалось бы, создать бесконечный цикл, если бы не было способа сказать, чтобы он не пытался и не запускал новую оболочку.

Вот пример

bash_script.sh:

#!/bin/bash echo Hello World 

.bashrc

 export HELLO_WORLD=$(bash_script.sh) 

Скрипт выполняется неинтерактивной оболочкой, в то время как .bashrc только автоматически создается интерактивными оболочками.


Однако есть способ вызвать бесконечный цикл. Каждая оболочка bash , интерактивная или нет, проверяет, установлена ​​ли переменная BASH_ENV и, если это так, использует ее значение как имя файла для источника. В этом случае выполнение сценария bash из этого файла приведет к бесконечному циклу, поэтому их необходимо принять. На практике, однако, этот скрипт (как следует из названия) просто используется для установки переменных среды для использования оболочкой, а не для выполнения произвольного кода.

Хорошо, я понял, как это сделать. В .bashrc просто выполните:

 export HELLO_WORLD=$(source bash_script.sh) 

Вам не нужно ничего делать. Просто запуск сценария bash не приведет к .bashrc .

Единственный раз, когда будет вызван ваш .bashrc , – если bash является интерактивным. Когда вы запускаете скрипт, этот скрипт не является интерактивным.

На странице справки bash:

Интерактивная оболочка запускается без аргументов без опционов и без опции -c, стандартный ввод и ошибка которой соединены с терминалами (как определено isatty (3)), или один начинается с параметра -i. PS1 установлен, а $ – включает i, если bash является интерактивным, позволяя сценарию оболочки или загрузочному файлу проверить это состояние.

Важный бит здесь «начат без аргументов без опционов». Когда вы запускаете скрипт, первым аргументом bash является путь к этому скрипту. Таким образом, он имеет необязательный аргумент и не является интерактивным.

Поместите это как строку 1:

 [ -z "$PS1" ] && return # If not interactive, exit