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はユーザーコマンドの入力にreadlineを使用しません。 代わりに、ネイティブZLEエディター(Zsh Line Editor)が使用されます。 これにより、複数行のコマンドの便利な編集、コマンド入力中の構文の強調表示、誤って挿入されたテキストを実行しないようクリップボードからの特別な「貼り付け」処理、ホットキーの柔軟な制御、元に戻す(自動補完と拡張の結果のキャンセルを含む)グローブ)...さらに、エディターの機能をzshと統合します。これにより、通常のzsh関数を使用してその動作を制御できます(たとえば、構文の強調表示が実装されます)。
- コマンドを完了するための非常に複雑で柔軟なメカニズム。 コンテキストに強く依存するため、コマンドラインのさまざまな場所で
<Tab>
を押すと、コマンド名、パラメーター、ファイル、ユーザー名とサーバー名、プロセス番号、変数名、配列インデックスとハッシュキー、zsh構文要素など、さまざまなものが追加されます、色とフォントの名前、ネットワークインターフェース、システムパッケージ...要するに、自動補完できるすべてのものです。 また、特定のチームの特定のコンテキストのオートコンプリートロジックを変更するまで、詳細に制御できます。 - zshの動作を変更する膨大な数のオプション(zsh-5.2では177)。 たとえば、サポートされている構文を変更し、sh / bash / ksh / cshとの互換モードを(部分的に含む)有効にすることができます。 zshでは、多くの関数が通常最初のコマンドに含まれる別個の「zsh互換モード」を作成する必要があったため、この関数のコードがzshによって予想どおりに正確に理解されることが保証されるため、作業に大きく影響することができます著者。
- 好みは、最も簡潔で簡潔な構文です-したがって、典型的な、かなり複雑なタスクを実行するために、できるだけ少ないテキストを入力する必要があります。 月の読みやすさが重要なコードでは、これは間違いなくマイナスです。 しかし、コマンドラインで-間違いなくプラス。
- フレームワーク(oh-my-zshやpreztoなど)、プラグイン、テーマなどによる設定のモジュール構成 実際、zshに固有のものは何もありません。bashでもまったく同じことができますが、...何らかの理由で、これはすべてzshにはすでに存在しますが、bashには存在しません(存在する場合、それを知っている人はほとんどいません) 。 また、これにより、Vimプラグインが重み付けされるように、既製の「キューブ」からzsh設定のバージョンを比較的迅速に組み立てることができます(例として、 zsh Antigenプラグインマネージャーのビデオを参照)。
違いと互換性
繰り返しになりますが、zsh機能の完全なセットではなく、bashとの違いを正確に説明することを明確にします。 あなたが精通しているほとんどの機能は、bashと同じようにzshで動作します。 しかし、ほぼ同じことを行うzsh固有の方法がしばしばあります。 これは、zshが他のシェルとの互換性に多くの注意を払っているという事実によるものです。そのため、他の多くのシェルがzshとその機能にドラッグされました。その結果、同じことを行ういくつかの代替方法がありました。
規約
- パラメータ:通常の変数-スカラー(文字列、整数、分数)、配列、連想配列(ハッシュ)。 また、変数は主に環境変数と呼ばれます。 エクスポートされたスカラーパラメーター。
- 引数:呼び出されたコマンドまたは関数のパラメーター(従来の意味)(関数の引数は、パラメーター
$@
、$1
、...を介して使用できます)。 - テンプレート: glob。 通常、テンプレートは実際のファイルとの一致を意味しますが、場合によっては文字列またはパラメーター値に適用されます。 本格的なレギュラーのサポートがありますが、ほとんどの場合、グローブはマッチングまたは検索/置換のテンプレートとしてどこでも使用されます。
- フラグ:影響するものの前に括弧で設定します。 パラメーターの場合、開始中括弧とパラメーター名の間に設定されます:
${(kv@)some_hash}
。 テンプレートの場合、先頭または中央に配置できます:*CaseImportant(#i)CaseIgnored*.txt
。 - 修飾子:テンプレートの後に括弧で設定し、ファイル名に関連付けられていないプロパティで指定します:
*(/^F)
。 - 修飾子:それぞれコロンの後に指定され、現在の値を順番に変更して適用されます。 パラメーターの場合、パラメーター名の後に指定されます:
$PWD:h:t
、${some_param:h:t}
。 テンプレートの場合、修飾子の閉じ括弧の前に指定されます:*(:e)
。
現在の設定
多くの組み込みコマンドは、起動時に現在の状態を引数なしで表示します(さらに多くの場合、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およびエミュレート
- オプションの名前では、大文字と小文字は関係なく、オプションの前に接頭辞「no」を追加できます。
- 同じ
setopt
オプションをプレフィックス「no」でunsetopt
、unsetopt
を「no」なしでsetopt
ます(逆も同様です!)同じことを行います。 -
setopt
の出力では、アンダースコアなしの小文字が使用され、ドキュメントではアンダースコア付きの大文字が使用されます。 これはいくつかの不便をもたらします-ドキュメントを検索するとき、目的のオプションを見つけるためにアンダースコアを挿入する場所を推測する必要があります。 -
emulate
コマンドを使用すると、sh、ksh、cshとの互換性状態またはzshのデフォルト状態でオプションのグループを大量に設定できます。 zshの多くの機能はemulateemulate -L zsh
コマンドで始まります。これにより、機能の継続中にキーオプションをzshのデフォルト状態にすることができます-これがないと、ほとんどの非自明な機能はユーザーが設定したオプションのために壊れる可能性があります(たとえば、配列にはインデックスが付けられます-1または0から)。
# 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番目の文ごとに「ただし、このようなオプションではすべて動作が異なる」というスタイルに改良する必要があります。)
パラメータ
- 規則:スカラーパラメーター名(文字列、整数、小数)には通常
$
文字を使用し、配列(通常および連想)-$
ます。 -
typeset -U
すると、一意の要素を持つ配列を宣言できtypeset -U
(既存の要素を追加しようとしても無視されます)。 -
typeset -T
すると、配列を$PATH
形式のスカラーに関連付けることができtypeset -T
。 これらの関連パラメーターのいくつかはすでに作成されています:$PATH
と$path
、$FPATH
と$fpath
、$MANPATH
と$manpath
、$CDPATH
と$cdpath
。 関連するパラメータについては、どちらを変更するかは問題ではありません。両方が同時に変更されます。 したがって、このようなパラメーターを使用したzshでは、ほとんどの場合配列($path
、$fpath
、...)を介して機能します-これははるかに便利です。 -
$PS1
、$PROMPT
、および$prompt
などの一部のスカラーパラメーターも相互接続されてい$prompt
(ただし、これらは1つのパラメーターの単なる同義語です)。
配列
- 1からインデックス付け
- (配列の最後から)負のインデックスを使用できます。
- スライスを使用できます。
- スカラーとして使用する場合-スペースを介して要素を結合します。
- スカラーのインデックス付けは、文字列文字を返します。
- globは配列を返すため、インデックスはglobの修飾子として使用できます:
*([2,-2])
。
パターン
-
**/
-サブディレクトリがない場合を含む、ネストレベルのサブディレクトリに一致します -
<1-2>
-ファイル名の指定された範囲の番号と一致します。範囲の開始と終了は省略できます -
(1|2)
-代替(EXTENDED_GLOB
オプションを使用する場合は括弧もグループ化) -
EXTENDED_GLOB
オプションを有効にすると、テンプレートで#
(前の要素を繰り返す)、~
および^
(一致からの例外)を追加で使用できます
# , # 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 .