.bashrc
читается только интерактивными оболочками. (На самом деле, это упрощение: bash в этом отношении причудлив. Bash не читает, является .bashrc
ли он оболочкой входа в систему, интерактивной или нет. И есть исключение даже из исключения: если родительский процесс bash равен rshd
или sshd
, то bash читает .bashrc
, будь то интерактивный или нет.)
Поместите определения вашей функции в файл в известном месте и используйте встроенную .
(также записанную source
) встроенную функцию для включения этого файла в сценарий.
$ cat ~/lib/bash/my_functions.bash
foo () {
…
$ cat ~/bin/myscript
#!/bin/bash
. ~/lib/bash/my_functions.bash
foo bar
Если хотите, можете воспользоваться функцией автозагрузки в ksh. Поместите каждое определение функции в файл с тем же именем, что и функция. Перечислите каталоги, содержащие определения функций в FPATH
переменной (список каталогов через двоеточие). Вот грубое приближение ksh, autoload
которое фактически загружает функцию сразу, а не по требованию:
autoload () {
set -- "$(set +f; IFS=:;
for d in $FPATH; do
if [ -r "$d/$1" ]; then echo -E "$d/$1"; break; fi;
done)"
[[ -n $1 ]] && . "$1"
}