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 .



Source: https://habr.com/ru/post/J326580/


All Articles