zstyle
どちらも同じことをしたり、setopt
それ以上のことをするように見えるので、なぜ両方が必要なのか理解できません。
答え1
setopt
シェルオプションの設定
住宅オプションシェル自体の動作を変更するブール変数です。setopt
オンまたはオフにします。引数なしで実行して、setopt
どのシェルオプションがデフォルトから切り替えられたかを確認できます。これらの一部は実行時に変更できません。代わりに、その目的はシェルの内部状態に関する情報を提供することです。
使用可能なシェルオプションはシェルによって決まり、自分で作成することはできません。ただし、すべてのシェルコードは、シェルオプションの値を読み取り、それに応じて独自の動作を変更するように決定できます。さらに、シェル関数または実行可能なシェルスクリプト(source
dを除く)は、周囲のシェルの残りの部分に影響を与えることなく、ローカルにシェルオプションを変更できます。
zstyle
名前空間属性の提供
zstyle [<flag>] ( <namespace> | <selector> ) <property> <value>
Zsh グローバル変数を置き換えます。それはシェルを受け入れますパスワード(シェル自体ではなく)ユーザーが設定を構成し、自分の内部状態を保存する方法を提供します。いいえ実際のグローバル変数でシェルを汚染します。
シェルオプションとは異なり、プロパティzstyle
はローカルで変更できません。代わりに、zstyle
名前空間とセレクタシステムを使用してください。属性を読み取るときにzstyle
読み取る属性の名前と名前空間を渡します。しかしいつ環境zstyle
あなたが渡す属性グローバルモードこれはCSSセレクタのように機能し、複数の名前空間に対して同じプロパティを同時に設定できます。 (CSSとのこの類似性のため、ここでは「スタイル」という言葉を使用したようです。)
名前空間にどの構文を使用するかはzstyle
重要ではありません。レイヤー区切り文字として使用されます:
(Zshで実行)完全なシステム)は単に合意にすぎません。
各zstyle
プロパティは文字列配列を格納します。しかし:
プロパティの設定時にこのフラグが渡されると、プロパティを読み取る
-e
と文字列がコードとして評価され、次のようになります。計算された属性- グローバル変数では不可能です。zstyle
複数提供値を取得してテストする便利な方法、これらの文字列配列を他の型に簡単に変換できます。
答え2
歴史を見ると役に立ちます。
zsh
1990年に初めて発売されました。 Bourne Shellとcshの利点を吸収します。
Bourneシェルのチューニングは、単一文字オプションで行うことも、特殊な組み込みオプションをsh
使用することもできます。たとえば、set
ワイルドカードを無効にした状態で起動sh -f
するsh
か、set -f
ワイルドカードを無効にした状態で実行します。
cshは、ユーザーが設定または設定解除した一般変数に調整され、その一部は起動オプションにマップされます。たとえば、csh -x
実行中のすべてのジョブを印刷するモードでcshを起動します。または、set verbose
実行中にモードに入ることもできます(unset verbose
終了)。
多くのzshはcshに基づいています。当時cshが人気のシェルだったからです。ここでは、cshを模倣していますが、通常の変数を使用してオプション設定を保存することはお勧めできません。setopt
とunsetopt
オプションは単一文字へのマッピングです。オプション。
ksh
1980年代には、一部のBourneオプションに名前が付けられ、設定set -o optionName
(および設定解除set +o
)が可能になりました。
1991 年 zsh 2.0.02 では、setopt
/ が /unsetopt
でエイリアスが指定されました。set -o
set +o
ksh
比較のために、bash
当時のオプションはcshのような一般的な変数であり、いくつかは起動/set
オプションにマッピングされ、いくつかの起動/set
オプションはその変数にすべてマッピングされませんでした。
set -o option
1990年頃、1.06から1.08の間にbashに追加されました。
Bash 2.0(1996)では、これらの変数が削除され、shopt
代替変数として導入されたため、2つのオプションセットがあります。一部はset -o
/ set set +o
、一部はshopt -s
/ setですshopt -u
。なぜそうなのかよく分からない。
AFAIK、1992年に初めて発売された時、set -o
すでにPOSIX.2仕様にありました。sh
そして、すべての最新のBourne様シェルは設定オプションをサポートしています。各シェルのオプションのリストはPOSIXで指定されたものより多様であるため(bash
上記の2番目のオプションセットを参照)、私はset -o
代わりにNot setopt
selfを使用する傾向があります。
zstyle
それ自体はるかに後で追加されましたcompstyle
1999年、オプションモジュールでzsh関数で書かれた以前のアプローチをC一般化および再実装しました。主なユースケースは、新しい完成システムの微調整を可能にすることでしたが、それでもそうです(他の用途に使用でき、使用されているにもかかわらず)。
これは、シェルオプション、変数、または関数とは無関係の名前空間です。シェルオプションや変数は関数に対してローカルにすることができますが、zstyle
s AFAIKは常にグローバルなので、sを使用してオプションや変数をzstyle
再実装することはできませんが、それほど価値があるという意味ではありません。それにもかかわらず、set -o
/はsetopt
以前のバージョンとの互換性のために維持されなければなりません。