Shell 命名空间

PSk*_*cik 10 shell

有没有办法将sourceshell 脚本放入命名空间,最好是 bash shell 脚本,但如果其他 shell 具有此功能而 bash 没有,我会查看它们。

我的意思是,例如,诸如“在所有定义的符号前面加上一些东西,这样它们就不会与已经定义的符号(变量名、函数名、别名)发生冲突”或任何其他防止名称冲突的工具。

如果有一个解决方案,我可以在source时间(NodeJS样式)中命名空间,那将是最好的。

示例代码:

$ echo 'hi(){ echo Hello, world; }' > english.sh
$ echo 'hi(){ echo Ahoj, sv?te; }' > czech.sh
$ . english.sh
$ hi
 #=> Hello, world
$ . czech.sh #bash doesn't even warn me that `hi` is being overwritten here
$ hi
 #=> Ahoj, sv?te
#Can't use the English hi now
#And sourcing the appropriate file before each invocation wouldn't be very efficient 
Run Code Online (Sandbox Code Playgroud)

mik*_*erv 11

从安装了...man ksh的系统上ksh93...

  • 名称空间
    • 作为namespace修改变量或创建新变量的命令列表的一部分执行的命令和函数,创建一个新变量,其名称是名称空间的名称,由前面的标识符给出.。当引用名称为 name 的变量时,首先使用 搜索它.identifier.name
    • 类似地,命名空间列表中的命令定义的函数是使用以..
    • 当命名空间命令的列表包含namespace命令时,创建的变量和函数的名称由变量或函数名称前面加上标识符列表组成.。在名称空间之外,在名称空间内创建的变量或函数可以通过在名称空间名称前加上名称来引用。
    • 默认情况下,以 开头的变量.sh位于sh名称空间中。

而且,为了演示,这里是应用于默认情况下为 shell 中分配的每个常规 shell 变量提供的命名空间的概念ksh93。在下面的示例中,我将定义一个discipline函数,该函数将充当shell 变量的分配.get方法$PS1。每一个shell变量基本上都有自己的命名空间,至少,默认getsetappend,和unset方法。定义以下函数后,任何时候$PS1在shell中引用该变量时,date都会在屏幕顶部绘制输出...

function PS1.get {
    printf "\0337\33[H\33[K%s\0338" "${ date; }"
}
Run Code Online (Sandbox Code Playgroud)

(还要注意()上面命令替换中缺少子shell)

从技术上讲,命名空间学科完全相同同样的事情(因为学科可以被定义为全局或局部应用到特定的命名空间,但它们都是重要组成部分,以壳的数据类型的概念化这是根本ksh93

要解决您的特定示例:

echo 'function hi { echo Ahoj, sv?te\!;  }' >  czech.ksh
echo 'function hi { echo Hello, World\!; }' >english.ksh
namespace english { . ./english.ksh; }
namespace czech   { . ./czech.ksh;   }
.english.hi; .czech.hi
Run Code Online (Sandbox Code Playgroud)
Hello, World!
Ahoj, sv?te!
Run Code Online (Sandbox Code Playgroud)

...或者...

for ns in czech english
do  ".$ns.hi"
done
Run Code Online (Sandbox Code Playgroud)
Ahoj, sv?te!
Hello, World!
Run Code Online (Sandbox Code Playgroud)