Ksh

在 Ksh 中使用指令和命名空間別名

  • July 6, 2015

我可以為 korn shell 命名空間創建別名嗎?是否有類似 using 指令的C++內容(如果符號指定不明確,則將多個命名空間放在一起並引發(編譯器)錯誤)?

儘管 ksh 具有比其他 shell 更高級的功能,但它的核心仍然是一種自動化簡單任務和編寫小腳本的語言,而不是一種用於編寫大型應用程序的語言。您不能期望擁有為大型應用程序設計的典型語言的所有特性,更不用說 C++ 的所有特性了。

我認為您不能為命名空間創建別名。您可以通過列舉其變數(解析 or 的輸出,或者如果要包含從父命名空間繼承的變數,則使用typeset +p)並一一複制它們來創建各種命名空間的副本。您可以使用 使變數成為另一個變數的別名,但這僅在命名空間內使用時生效: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}; }
}

我認為您必須為每個變數定義這些,並且您無法檢測到添加到 namespace 的變數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}}
}

引用自:https://unix.stackexchange.com/questions/213999