bashからzshへの移行

bashからzshに切り替えるには、それらの基本的な違いを知る必要があります。これがないと、 ~/.zshrc



でzshの初期セットアップを行うのが難しくなります。







私は自分自身を調べたときにこれらの違いの簡単な説明を見つけることができず、zshのドキュメントを読むのに多くの時間を費やす必要がありました。 この記事により、zshへの切り替えが容易になることを願っています。







なぜ行く



そもそも-移行に時間と注意を払う価値はありますか? POSIX shまたはbashほど一般的ではない別の方言shを学び、作業環境を再構成します...







私の意見では、コンソールで多くの時間を過ごすなら、VimやEmacsが好きで、すでに「自分用に」セットアップするのに多くの時間を費やしていることに間違いありません。 Zshは精神的に非常に似ています:非常に複雑で柔軟なプログラムであり、その能力はほとんど知られていない人ですが、設定に時間をかけると、 非常に便利な作業環境を個人的に得ることができます







新しい方言shの研究に関しては、この利点はほとんどありませんが、この記事で説明されている最小値はzshを構成するのに十分であり、zsh方言で新しいスクリプトを作成することを提供する人はいません。 一般に、これは、Vim / Emacsを構成するために、VimLまたはEmacs Lispを最低限知っている必要があることと違いはありません。







インターネットには、zshの特定の機能を説明する記事やプレゼンテーションがたくさんあります。これにより、誰かの生活が大幅に簡素化されました。 誰もが異なる機能を必要とするため、私はそれらをリストしません。zshにはあらゆる好みのオプションがあります。 代わりに、これらの機能を実装できるzshの主要な機能について説明します。









違いと互換性



繰り返しになりますが、zsh機能の完全なセットではなく、bashとの違いを正確に説明することを明確にします。 あなたが精通しているほとんどの機能は、bashと同じようにzshで動作します。 しかし、ほぼ同じことを行うzsh固有の方法がしばしばあります。 これは、zshが他のシェルとの互換性に多くの注意を払っているという事実によるものです。そのため、他の多くのシェルがzshとその機能にドラッグされました。その結果、同じことを行ういくつかの代替方法がありました。







規約





現在の設定



多くの組み込みコマンドは、起動時に現在の状態を引数なしで表示します(さらに多くの場合、zshコマンドのスタイルで出力を描画する引数があり、非常に便利です)。







 #   setopt #     setopt KSH_OPTION_PRINT; setopt #       bindkey #      ,    zsh for m in $(bindkey -l); bindkey -M $m -L #   (- ) zstyle zstyle -L #   (  ),    zsh alias -L #    ,    zsh alias -s -L #   () typeset #   (),    zsh typeset -p
      
      





これは完全なリストではありませんが、zsh構成のプロセス(分析)のほとんどのタスクについては十分なはずです。







zsh -f



も役立つ場合があります。これにより、zshがデフォルト状態で起動します(ほとんどのシステムでは使用できない/etc/zshenv



以外の起動スクリプトは実行されません)。







setoptおよびエミュレート





 #         setopt nonumericglobsort setopt NO_numericglobsort setopt NO_NUMERIC_GLOB_SORT setopt _N_O_numERICglob_SORT_ unsetopt NUMERIC_GLOB_SORT unsetopt numericglobsort
      
      





zshの使用開始時、bash後のより身近な作業のために、以下のオプションをお勧めします。







 #    fd unsetopt MULTIOS #  ~…  file completion  =   setopt MAGIC_EQUAL_SUBST #   escape sequence  echo  -e setopt BSD_ECHO #      setopt INTERACTIVE_COMMENTS #  $(cmd)  $PS1 etc. setopt PROMPT_SUBST
      
      





SH_WORD_SPLIT



オプションもあり、bash後の通常の作業では正式に有効にする必要がありますが、これも有効にする必要がありますが、このオプションを使用しないzshの動作はより便利で論理的であるため、すぐに慣れることをお勧めします。 cmd $PARAM



の値がスペースを含む文字列である場合のcmd $PARAM



動作は、bash cmd



いくつかの引数を受け取り、zshで1つ( cmd "$PARAM"



が呼び出されたかのように)を処理します。 また、 $PARAM



が配列の場合、zshはcmd



配列の空でない要素ごとに1つの引数を与えます(これらの要素にスペースが含まれている場合でも)。







(基本的に、この記事ではデフォルトのオプションを使用したzshの動作について説明します。そうしないと、2番目の文ごとに「ただし、このようなオプションではすべて動作が異なる」というスタイルに改良する必要があります。)







パラメータ





配列





パターン





 #        , #         5   example, #     .txt ls -l **/*(<5->|example)*.txt
      
      





フラグ/修飾子/修飾子



テンプレートのみに修飾子があり、ファイルを選択するための追加条件を指定できます:タイプ(ファイル/ディレクトリ/シンボリックリンク/など)、権利、時間(変更/など)、サイズ...選択したファイルをソートおよびインデックスできます。 ピリオドで始まる名前を持つ最初の*



一致するこの特定のパターンに含めることができます。 どのテンプレートとも一致しない場合、コマンドライン引数からこのテンプレートを削除できます。







 #  5-   , #         "a", #    ls -ld *a*(D/om[1,5])
      
      





EXTENDED_GLOB



オプションを有効にすると、テンプレートでフラグを使用できます。ファイルの場合、大文字と小文字の区別の制御が重要であり、パラメータ/行に一致する場合、他の有用なフラグがあります。







 #    ls -ld .[cC][oO][nN][fF][iI][gG]* setopt extendedglob; ls -ld .(#i)Config*
      
      





パラメーターには、さらに多くのフラグを使用できます:すべての(空を含む)配列要素を引用符で表示する、特定のサブストリングで結合または分割を実行する、連想配列のキーおよび/または値のみを表示する、さまざまな種類の引用符でエスケープする、逆の操作など







 #       echo ${(k)some_hash} #  $PATH       ":", #          echo ${(s<:>qq)PATH}
      
      





テンプレートとパラメーターに修飾子を使用できます:最後のパス要素の削除、最後以外のすべてのパス要素の削除、拡張機能の削除/拡張、エスケープと逆の操作、部分文字列の検索と置換など。







 #     (   #  ,       ) echo $PWD:h:t #   ( )     , #     "fil"  "FIL" (   ) echo **/*(@:t:s/fil/FIL/)
      
      





autoload -Uz



source /path/to/file.sh



またはを使用してコードをロードする従来の方法に加えて zshコードの自動ロードの. /path/to/file.sh



は、最初の関数呼び出しの時点でアクティブに使用されます。







目的の関数でファイルを検索するには、 $FPATH



を使用します。これは、 $PATH



と形式が似た変数で、ロードされた関数の名前と同じ名前でファイルが検索されるディレクトリのリストが含まれます。







autoload



呼び出されるとautoload



ファイルはディスクから読み取られず、それらの存在もチェックされません。これはすべて、関数が最初に呼び出されたときに行われます。 ほとんどの場合、 autoload



引数を渡す必要があります-U



(多くの場合、ユーザーが設定したエイリアスはサードパーティの機能の動作を妨げる可能性があるため、ダウンロードしたファイルの現在のエイリアスの効果をキャンセルします)および-z



(ダウンロードしたファイルがzsh形式であるというオプションの仕様ですが、それよりも安全です)常に尋ねます)。







 fpath=(~/my-zsh-functions $fpath) autoload -Uz fn fn
      
      





さらに、ファイル~/my-zsh-functions/fn



の内容は、次の3つの形式のいずれかになります。







 #   ,  - : echo "  fn"
      
      





 #        : fn() { echo "  fn" }
      
      





 #      ,  fn: fn() { fn2 } fn2() { echo "   fn" } echo "    fn" #       fn: fn "$@" echo "    fn"
      
      





zkbd



zshの最初の起動時に、F1 / Backspace / Delete / cursorなどのボタンの一部が正しく機能しないことがよくあります。 これは、コンソールアプリケーションの大部分がreadlineを使用しており、これらのボタンの正しい設定が/etc/inputrc



および~/.inputrc



から読み取られますが、zshでは読み取られないためです。







問題は~/.zshrc



ます。どのエスケープシーケンスがターミナルで必要なボタンを生成するかを調べ、これらのエスケープシーケンスに必要なハンドラを~/.zshrc



設定する必要があります。 このようなもの:







 bindkey '^[[A' up-line-or-history # Up bindkey '^[[B' down-line-or-history # Down #  ..
      
      





cat >/dev/null



を実行し、目的のボタンの前でCtrl-V



を押すと、ボタンによって表示されるシーケンスを見ることができます。 (そして、はい、2017年にこれを行うと、少し奇妙に感じました...)しかし、このプロセスを自動化するzkbd



ユーティリティにはzshが付属しています。 これを行うには、 ~/.zshrc



接続します。その後、必要なエスケープシーケンスを含む連想配列$key



が作成されます。







 autoload -Uz zkbd [[ ! -f ~/.zkbd/$TERM-${${DISPLAY:t}:-$VENDOR-$OSTYPE} ]] && zkbd source ~/.zkbd/$TERM-${${DISPLAY:t}:-$VENDOR-$OSTYPE} [[ -n $key[Up] ]] && bindkey -- $key[Up] up-line-or-history [[ -n $key[Down] ]] && bindkey -- $key[Down] down-line-or-history #  ..
      
      





どのコマンド( up-line-or-history



)をどのボタンに割り当てるかを詳細に指定しません。まず、すべてを連続して割り当てるのではなく、箱から出して機能しないものだけを割り当てる必要があるためです。 HomeまたはBackspaceが全員のために何をすべきかについては、UpとDownの履歴の検索はまったく異なる方法で行うことができ、これらの場合の機能もこれらのボタンに割り当てる必要があります。







(ところで、bindkeyパラメーターでエスケープ文字( ^[



)を実際の文字で指定し、 Ctrl-V



Ctrl-V



、通常の2文字^[



、および2文字\e



ます。)







zstyle



これは、状況依存の設定を使用する組み込みの方法です。 多くの点で、通常のパラメーターに似ていますが、パラメーターの名前と値に加えて、 zstyle



「コンテキスト」テンプレートを設定できzstyle



。 そして、現在のコンテキストに関連する値を取得します。 このアプローチは、自動補完の作業を構成するために積極的に使用されますが、独自のスクリプトに使用することもできます。







 #   my-param=default  3-  , #        (  #    zstyle,      ) #        % zstyle ':my-app:*:*' my-param default #   my-param=val-one  ,    #  ( )    "one" % zstyle ':my-app:one:*' my-param val-one #   my-param=val-two  ,    #  ( )    "two" % zstyle ':my-app:*:two' my-param val-two #   my-param   result    % zstyle -s ':my-app:a:b' my-param result % echo $result default % zstyle -s ':my-app:one:b' my-param result % echo $result val-one % zstyle -s ':my-app:a:two' my-param result % echo $result val-two % zstyle -s ':my-app:one:two' my-param result % echo $result val-one
      
      





zmodload



追加のzsh機能の一部は、 autoload -Uz



使用してロードされる通常のスクリプトではなく、 *.so



システムライブラリとして実装されます。 たとえば、PCRE正規表現、数学関数、ソケットなどへのアクセスを提供するために使用されます。 そのようなライブラリは、 zmodload



を介してロードされます。







雑多



標準trap '…;code;…' INT



加えて、シグナルをインターセプトするために、特別な名前の関数を使用できます: TRAPINT() { …;code;… }









if



while



などのような多くの構造 省略形があります(上記の例では、すべてのバインドキーモードの値が表示されています)。







突然、zsh固有の類似コマンドであるecho



コマンド( print



コマンド)は、zshを学習する際に非常に便利であることが判明しました。 彼女は多くのことを知っていますが、最も有用なものから:







 #      ,    print -l $path #        , #        print -a -C 2 "${(kv@)ZSH_HIGHLIGHT_STYLES}" | sort #   %-   $PS1 print -P '%Bbold%b %F{red}current%f dir is: %~'
      
      





もし zsh, // Awesome- zsh .








All Articles