在 Ksh 中使用指令和命名空间别名

在 Ksh 中使用指令和命名空间别名

我可以为 korn shell 命名空间创建别名吗?是否有类似 using 指令的内容C++(将多个命名空间放在一起,如果符号指定不明确,则抛出(编译器)错误)?

答案1

尽管 ksh 比其他 shell 具有更高级的功能,但它的核心仍然是一种自动执行简单任务和编写小型脚本的语言,而不是一种适合编写大型应用程序的语言。您不能指望拥有为大型应用程序设计的典型语言的所有功能,更不用说 C++ 的所有功能了。

我认为您不能为名称空间创建别名。您可以通过枚举其变量(解析typeset +por的输出typeset -p,或者如果要包含从父命名空间继承的变量,则使用${!.foo.*})并一一复制来创建某种命名空间的副本。您可以使用 使一个变量成为另一个变量的别名typeset -n,但这仅在命名空间内使用时才生效:

$ namespace foo { x=1; }
$ namespace bar { typeset -n x=.foo.x; echo $x; }
1
$ namespace foo { x=2; }
$ namespace bar { echo $x; }
2
$ echo ${.bar.x}
.foo.x

Ksh 可以让您更进一步,通过规则函数在读取、修改或取消设置变量时执行任意代码。例如,如果您定义一个名为 的函数,则每次检索x.get的值时都会调用该函数。x

namespace bar {
  x.get () { _=${.foo.x}; }
  x.set () { .foo.x=${.sh.value}; }
  x.append () { .foo.x+=${.sh.value}; }
  x.unset () { unset ${.sh.name}; }
}

我认为您必须为每个变量定义这些变量,并且您无法检测添加到名称空间的变量foo

这可以扩展到查找多个名称空间。

x.get () {
  if ((${.foo.x+1}+${.bar.x+1}!=1)); then
    echo 1>&2 "Ambiguous variable x, available in more than one of foo and bar"
    exit 125
  fi
  _=${.foo.x-${.bar.x}}
}

相关内容