无法在 bash 脚本中使用从 .bashrc 导出的函数

无法在 bash 脚本中使用从 .bashrc 导出的函数

我的.bashrc文件导出一个名为的函数lookup

lookup() {
  grep -r -ne "$1" * | grep -v "TAGS:" | grep -v "tags:"
}
export -f lookup

我可以在 shell 中使用该函数。但如果我将其放入如下脚本中:

#!/bin/bash
lookup "foo"

并运行脚本,然后 bash 报告“命令未找到” lookup。这在以前是可以工作的。我强烈怀疑在我的系统上对 bash 进行安全更新后,它就停止工作了(可能与 shellshock/bashdoor 有关?)我的 bash 版本是 openSUSE 11.4 上的 4.1.10(1)

答案1

查看http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

非交互方式调用

当 Bash 以非交互方式启动时,例如,要运行 shell 脚本,它会在环境中查找变量 BASH_ENV,如果出现则扩展其值,并使用扩展的值作为要读取和执行的文件的名称。

具体来说,~/.bashrc、~/.profile、~/.bash_profile 都不是来源。仅当 shell 是交互式 shell 时,才会调用 ~/.bashrc。

您有以下几种选择:

  1. 明确地获取你的 .bashrc

    #!/bin/bash
    . ~/.bashrc
    lookup "foo"
    
  2. 使用交互标志启动 bash

    #!/bin/bash -i
    lookup "foo"
    
  3. 启动脚本时设置 BASH_ENV 变量:

    BASH_ENV=$HOME/.bashrc /path/to/my/script
    

相关内容