setoptとzstyleの他の用途は何ですか?

setoptとzstyleの他の用途は何ですか?

zstyleどちらも同じことをしたり、setoptそれ以上のことをするように見えるので、なぜ両方が必要なのか理解できません。

答え1

setoptシェルオプションの設定

住宅オプションシェル自体の動作を変更するブール変数です。setoptオンまたはオフにします。引数なしで実行して、setoptどのシェルオプションがデフォルトから切り替えられたかを確認できます。これらの一部は実行時に変更できません。代わりに、その目的はシェルの内部状態に関する情報を提供することです。

使用可能なシェルオプションはシェルによって決まり、自分で作成することはできません。ただし、すべてのシェルコードは、シェルオプションの値を読み取り、それに応じて独自の動作を変更するように決定できます。さらに、シェル関数または実行可能なシェルスクリプト(sourcedを除く)は、周囲のシェルの残りの部分に影響を与えることなく、ローカルにシェルオプションを変更できます。

zstyle名前空間属性の提供

zstyle [<flag>] ( <namespace> | <selector> ) <property> <value>Zsh グローバル変数を置き換えます。それはシェルを受け入れますパスワード(シェル自体ではなく)ユーザーが設定を構成し、自分の内部状態を保存する方法を提供します。いいえ実際のグローバル変数でシェルを汚染します。

シェルオプションとは異なり、プロパティzstyleはローカルで変更できません。代わりに、zstyle名前空間とセレクタシステムを使用してください。属性を読み取るときにzstyle読み取る属性の名前と名前空間を渡します。しかしいつ環境zstyleあなたが渡す属性グローバルモードこれはCSSセレクタのように機能し、複数の名前空間に対して同じプロパティを同時に設定できます。 (CSSとのこの類似性のため、ここでは「スタイル」という言葉を使用したようです。)

名前空間にどの構文を使用するかはzstyle重要ではありません。レイヤー区切り文字として使用されます:(Zshで実行)完全なシステム)は単に合意にすぎません。

zstyleプロパティは文字列配列を格納します。しかし:

  • プロパティの設定時にこのフラグが渡されると、プロパティを読み取る-eと文字列がコードとして評価され、次のようになります。計算された属性- グローバル変数では不可能です。

  • zstyle複数提供値を取得してテストする便利な方法、これらの文字列配列を他の型に簡単に変換できます。

答え2

歴史を見ると役に立ちます。

zsh1990年に初めて発売されました。 Bourne Shellとcshの利点を吸収します。

Bourneシェルのチューニングは、単一文字オプションで行うことも、特殊な組み込みオプションをsh使用することもできます。たとえば、setワイルドカードを無効にした状態で起動sh -fするshか、set -fワイルドカードを無効にした状態で実行します。

cshは、ユーザーが設定または設定解除した一般変数に調整され、その一部は起動オプションにマップされます。たとえば、csh -x実行中のすべてのジョブを印刷するモードでcshを起動します。または、set verbose実行中にモードに入ることもできます(unset verbose終了)。

多くのzshはcshに基づいています。当時cshが人気のシェルだったからです。ここでは、cshを模倣していますが、通常の変数を使用してオプション設定を保存することはお勧めできません。setoptunsetoptオプションは単一文字へのマッピングです。オプション。

ksh1980年代には、一部のBourneオプションに名前が付けられ、設定set -o optionName(および設定解除set +o)が可能になりました。

1991 年 zsh 2.0.02 では、setopt/ が /unsetoptでエイリアスが指定されました。set -oset +oksh

比較のために、bash当時のオプションはcshのような一般的な変数であり、いくつかは起動/setオプションにマッピングされ、いくつかの起動/setオプションはその変数にすべてマッピングされませんでした。

set -o option1990年頃、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 setoptselfを使用する傾向があります。

zstyleそれ自体はるかに後で追加されましたcompstyle1999年、オプションモジュールでzsh関数で書かれた以前のアプローチをC一般化および再実装しました。主なユースケースは、新しい完成システムの微調整を可能にすることでしたが、それでもそうです(他の用途に使用でき、使用されているにもかかわらず)。

これは、シェルオプション、変数、または関数とは無関係の名前空間です。シェルオプションや変数は関数に対してローカルにすることができますが、zstyles AFAIKは常にグローバルなので、sを使用してオプションや変数をzstyle再実装することはできませんが、それほど価値があるという意味ではありません。それにもかかわらず、set -o/はsetopt以前のバージョンとの互換性のために維持されなければなりません。

関連情報