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

Jan*_*rek 2 bash bashrc

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

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

我可以在 shell 中使用该函数。但是如果我把它放在这样的脚本中:

#!/bin/bash
lookup "foo"
Run Code Online (Sandbox Code Playgroud)

并运行脚本,然后 bash 报告“未找到命令” lookup。这曾经工作过一段时间。我强烈怀疑这在我的系统上的 bash 安全更新后停止工作(可能与 shellshock/bashdoor 相关?)我的 bash 版本是 openSUSE 11.4 上的 4.1.10(1)

gle*_*man 7

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

非交互式调用

Bash非交互启动时,为了运行一个shell脚本,例如在环境中寻找变量BASH_ENV,如果出现就将其值展开,并将展开后的值作为文件名进行读取和执行.

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

你有几个选择:

  1. 明确来源您的 .bashrc

    #!/bin/bash
    . ~/.bashrc
    lookup "foo"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用交互式标志启动 bash

    #!/bin/bash -i
    lookup "foo"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 启动脚本时设置 BASH_ENV 变量:

    BASH_ENV=$HOME/.bashrc /path/to/my/script
    
    Run Code Online (Sandbox Code Playgroud)