有没有办法像 C 中那样为 bash 提供命名空间?

有没有办法像 C 中那样为 bash 提供命名空间?

我所说的就像在 C 中一样,你可以使用带有语句的命名空间using namespace blah blah blah,你能在 bash 中做同样的事情吗?

答案1

嗯,C 中没有命名空间,C++ 中是有的。但C中没有。

不,两者都没有命名空间bashbash具有三个名称空间——局部变量、函数和环境变量。所以你可以同时拥有变量foo和函数。foo()但不是两个不同的foo()功能。如果定义它们 - 第二个将始终覆盖第一个。

在 中bash,如果您确实需要处理名称冲突 - 常见的解决方案是为源变量和/或函数提供前缀或后缀。

答案2

不,bash 本身没有命名空间。但是,您可以构建一个 bash 模块库,然后可以使用该source命令有选择地将其导入到任何给定的脚本中。事实上,您可以编写一个import函数来模拟现代编程语言的语法。

例如,您可以执行如下操作:

#!/bin/bash
[[ -e "$HOME/libbash/core.sh" ]] && {
    source "$HOME/libbash/core.sh"
}
include "string"   # sources $HOME/libbash/string.sh
include "fs/msys"  # sources $HOME/libbash/fs/msys.sh"

这期望 ~/libbash 文件夹包含 core.sh 以及以下导入定义:

#!/bin/bash
#echo "${BASH_SOURCE[0]}"
LIBBASHDIR="$HOME/libbash"

import () {
    for f in "$@"; do
        if [[ -f "$LIBBASHDIR/$f.sh" ]]; then
            source "$LIBBASHDIR/$f.sh"
        else
            echo >&2 "import: not found: '$f.sh'"
        fi
    done
}

该脚本只能在您的系统上运行,这违背了 bash 脚本最常见的用例之一:创建在其他人的系统上运行的安装脚本。但是,如果您发现自己在控制的一台或多台计算机上编写脚本时大量重复相同的习惯用法,那么它肯定可以为您节省大量时间。

相关内容