Ont*_*nio 17 bash shell-script function
我bash在我的~/.bashrc文件中定义了一个函数。这允许我在 shell 终端中使用它。但是,当我从脚本中调用它时,它似乎不存在。
如何定义bash脚本也使用的函数?
Chr*_*own 12
~/.bash_profile并且~/.bashrc不被脚本读取,默认情况下不导出函数。为此,您可以export -f像这样使用:
$ cat > script << 'EOF'
#!/bin/bash
foo
EOF
$ chmod a+x script
$ ./script
./script: line 2: foo: command not found
$ foo() { echo "works" ; }
$ export -f foo
$ ./script
works
Run Code Online (Sandbox Code Playgroud)
export -f foo也可以~/.bash_profile在登录后调用以使该函数可用于脚本。请注意,export -f它不可移植。
更好的解决方案是使用. file. 这更加便携,并且不依赖于以特定方式设置的环境。
.bashrc只能由交互式 shell 读取。(实际上,这过于简单化了:bash 在这方面很古怪。Bash 不会读取.bashrc它是否是登录 shell,无论是否交互。甚至还有一个例外:如果 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
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以遵循 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"
}
Run Code Online (Sandbox Code Playgroud)