我bash
在~/.bashrc
文件中定义了一个函数。这使我可以在外壳端子中使用它。但是,当我从脚本中调用它时,它似乎不存在。
如何定义bash
脚本也要使用的功能?
/bin/sh
在shebang线上使用吗?
我bash
在~/.bashrc
文件中定义了一个函数。这使我可以在外壳端子中使用它。但是,当我从脚本中调用它时,它似乎不存在。
如何定义bash
脚本也要使用的功能?
/bin/sh
在shebang线上使用吗?
Answers:
~/.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
export -f foo
也可以~/.bash_profile
在登录后调用此功能以使脚本可使用此功能。警告,export -f
它不可携带。
更好的解决方案是使用来获取包含函数的文件. file
。这更具可移植性,并且不依赖于以特定方式设置您的环境。
function myFunction { ... }
in 这样的函数~/.bash_profile
,您就可以开始了吗?
export
解决方案似乎正常工作。谢谢。
foo
功能file
2)file
与确保调用外壳程序相比,您可以更好地控制脚本的内容foo
在调用脚本之前没有变化。例如,您可以添加安全检查file
以确保其不受干扰。(不容易,但可能)。(好吧,您也可以对已定义的foo函数进行检查...但是您得到的结果是^^我认为方法2更加干净。)3)file
仅包含所需内容,而不仅仅是更多内容。
.bashrc
仅由交互式外壳读取。(实际上,这是一个过分的简化:bash在这方面很古怪。bash不管是不是.bashrc
交互式登录外壳,都不会读取。甚至有一个例外:如果bash的父进程是rshd
or 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"
}
您需要功能吗?如果不是这样,请考虑在中将逻辑提取到单独的独立Bash脚本中$PATH
。例如,我在~/.bashrc
:
# echo public IP address
alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'
~/bin
在中$PATH
,因此我创建~/bin/wanip
了以下内容:
#!/bin/bash
# echo public IP address
dig +short myip.opendns.com @resolver1.opendns.com
并运行chmod 0755 ~/bin/wanip
使其可执行。现在,我可以wanip
从其他脚本执行。
我喜欢使用wanip
独立的Bash脚本。它使我想起我希望这种逻辑通常可用(仅在我当前的交互式Bash会话中除外)。该脚本很好地封装了逻辑和文档。