Kshでディレクティブと名前空間エイリアスを使用する

Kshでディレクティブと名前空間エイリアスを使用する

kornシェルネームスペースのエイリアスを作成できますか? usingディレクティブC++(複数の名前空間を一緒に配置し、シンボルがあいまいに指定されている場合(コンパイラ)エラーを引き起こす)のようなものはありますか?

答え1

kshは他のシェルよりも高度な機能を備えていますが、その中核は依然として大規模なアプリケーションの作成に適した言語ではなく、簡単な作業を自動化し、小さなスクリプトを書くための言語です。 C ++のすべての機能はもちろん、大規模なアプリケーション用に設計された一般的な言語のすべての機能を期待することはできません。

名前空間のエイリアスを作成することはできないようです。その変数を列挙して(親名前空間から継承された変数を含める場合、またはtypeset +p出力を解析または使用)、それらを1つずつコピーして、一種の名前空間のコピーを作成できます。別名を使用してある変数を別の変数にすることはできますが、これは名前空間内で使用されている場合にのみ機能します。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}}
}

関連情報