.bashrc 中定义的 Bash 函数不适用于其他脚本

.bashrc 中定义的 Bash 函数不适用于其他脚本

我经常执行这个命令。

load_module virtuoso

它在终端上运行良好。

所以我把它放在一个名为的 bash 脚本中load.sh,该脚本是可执行的。

    #!/bin/bash
    echo "Hello"
    load_module virtuoso

但是当我尝试使用执行它时./load.sh,它给出了这个错误,

./load.sh: line 3: load_module: command not found

我尝试通过输入echo "hello"“load.sh”文件来调试它。hello当我执行该文件时,它会打印在屏幕上,所以我猜这个脚本运行正常。我不知道还能尝试什么。谢谢

以下是摘要。

een212023@hertz:~/iec_lab1$ ls -la load.sh
-rwxr-xr-x 1 een212023 nogroup 46 Aug 19 17:59 load.sh
een212023@hertz:~/iec_lab1$ cat load.sh
#!/bin/bash
echo "Hello"
load_module virtuoso
een212023@hertz:~/iec_lab1$ load_module virtuoso
een212023@hertz:~/iec_lab1$ ./load.sh
Hello
./load.sh: line 3: load_module: command not found
een212023@hertz:~/iec_lab1$



een212023@hertz:~/iec_lab1$ type -a load_module
load_module is a function
load_module ()
{
    if already_loaded $1; then
        return 0;
    fi;
    load_vars_of_module $1;
    declare -a required_here=("${additional_required[@]}");
    declare -a conflicts_here=("${additional_conflicts[@]}");
    load_required_modules ${required_here[*]};
    unload_conflicting_modules ${conflicts_here[*]};
    load_vars_of_module $1;
    init_all_paths;
    add_paths ${additional_path[*]};
    add_ldpaths ${additional_ldpath[*]};
    add_manpaths ${additional_manpath[*]};
    add_lmpaths ${additional_lmpath[*]};
    exportvars ${additional_exports[*]};
    newaliases "${additional_aliases[@]}";
    unset ${!additional*};
    export MODULES=${MODULES}:$1
}

答案1

正如其他人所说,您需要在加载脚本时定义您的函数。

我通过一个脚本文件来实现这一点,该文件包含我在脚本中常用的“常用”函数。我们称这个文件为/path/to/bash-common.sh- 在您的例子中,这个脚本将包含函数load_module

然后我要做的是在所有其他脚本中引用这个通用脚本,因此我的所有脚本都是这样开始的:

#!/bin/bash
source /path/to/bash-common.sh

就你的情况而言,你的load.sh将是:

#!/bin/bash
source /path/to/bash-common.sh

echo "Hello"
load_module virtuoso

如果您愿意的话,您也可以这样source /path/to/bash-common.sh做。.bashrc

通过这种方式,您只需在一个地方维护所有自定义函数,并且可以在任何地方访问此文件(如果您在 中获取它,则包括在交互式 shell 中.bashrc)。

相关内容