我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功能file2)file与确保调用外壳程序相比,您可以更好地控制脚本的内容foo在调用脚本之前没有变化。例如,您可以添加安全检查file以确保其不受干扰。(不容易,但可能)。(好吧,您也可以对已定义的foo函数进行检查...但是您得到的结果是^^我认为方法2更加干净。)3)file仅包含所需内容,而不仅仅是更多内容。
                    .bashrc仅由交互式外壳读取。(实际上,这是一个过分的简化:bash在这方面很古怪。bash不管是不是.bashrc交互式登录外壳,都不会读取。甚至有一个例外:如果bash的父进程是rshdor 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会话中除外)。该脚本很好地封装了逻辑和文档。