LinuxやWindowsのWSL、macOSでのターミナルでコマンドをつけつけるプログラムをシェル(Shell)と読んでいます。zsh はこのシェルの一種です。シェルはユーザが直接入力することから、いろいろな拡張がされた亜種がたくさんあります。歴史については **~sven_mascheck/
** のサイト参照してみてください。
LinuxにとってはBashは必須のシェルであり、システムの基本部分を担うものですが、Zshはユーザーにとっての利便性を高めることを重視して設計された、追加ソフトウェアとなります。
LinuxやWSL、macOS Catalina 以前では bash がデフォルトのシェルですが、macOS Catalina 以降では zsh がデフォルトのシェルとなっています。
zsh の便利な機能を列挙してみます。
ディレクトリ移動が簡単
プラグインやテーマが豊富
パス補完
/u/lo/b
とタイプして、TABキーを押すと、/usr/local/bin
に自動補完してくれますメニュー補間
コンテキスト補間
インライン展開
Glob展開
**/
はカレントディレクトリ以下の全てのディレクトリに展開されます。
次の例は、カレントディレクトリ以下のすべてのRustプログラムのソースファルを一覧するものです。% ls **/*.rs
ラインエディタ ZLE
Bash と Zsh で挙動の違いの主なものをまとめてみます。
設定ファイル BashとZshでは読み込む設定ファイルが異なります。
Glob展開でのカレントディレクトリとペアレントディレクトリの有無
Bashで .*
を展開するとカレントディレクtp李( .
)とペアレントディレクトリ( ..
)が含まれてしまういます。Zshはこれを含まないのがデフォルト動作となるため、ファイル名一覧を取得するときなど手間が省けます。
パイプでのプロセス
Bashではパイプで実行されるコマンドは全て別のプロセスで実行されます。パイプ先がwhile
であるときでは、変数やshift
などの操作が別プロセスであるため、期待した動作とならない問題があります。Bash 4.2以降ではlastpipe
オプションを有効にするとパイプの最後は同一プロセス内で実行されるようになりました。Zshは、パイプの最後のコマンドは同一プロセスで実行されます。