Linuxユーザーとして、私は常にbashを使用してきました。これは、使用したすべてのディストリビューションのデフォルトであったためです。 BSDなどの他のUnixシステムを使用している人々は、他のシェルをはるかに頻繁に使用しているようです。もう少し学ぶために、zshを試すことにしました。
Bashユーザーとして:
他のStack Exchangeサイトでは、このトピックに関するかなりの活動がすでに行われています。私がbashからzshに切り替えたときの経験は、覚えている限り(数年前²でした)、1つのことを見逃していなかったということです。私はたくさん得ました。私が最もよく使用する単純なzsh固有の機能は次のとおりです。
ときどきbashを使用するときに最も見落としているzsh機能はautocdです。zshでディレクトリを実行すると、autocd
オプションをオンにすると、ディレクトリに移動することになります。⁴
別の非常に便利な機能は、派手なグロビングです。の 象形文字文字は覚えるのが少し難しいですが、非常に便利です(たとえば、同等のfind
コマンドを記述するよりも、文字を検索する方が速い場合があります)。より簡単な例のいくつか:
_foo*~*.bak
_ = _foo*
_に一致するものを除くすべての_*.bak
_に一致foo*(.)
= _foo*
_に一致する通常のファイルのみfoo*(/)
= _foo*
_に一致するディレクトリのみfoo*(-@)
= _foo*
_に一致するぶら下がりシンボリックリンクのみfoo*(om[1,10])
= _foo*
_に一致する最新の10ファイルfoo*(Lm+1)
= 1MBを超えるサイズのファイルのみ
_dir/**/foo*
_ = dir
ディレクトリおよびそのすべてのサブディレクトリ内の_foo*
_を再帰的に⁴
凝った名前の変更には、zmv
ビルトインが便利です。たとえば、すべての_file
_を_file.bak
_にコピーするには:zmv -C '(*)(#q.)' '$1.bak'
Bashとzshのどちらにも適切な補完システムがあり、明示的にオンにする必要があります(_. /etc/bash_completion
_または_autoload -U compinit; compinit
_)。 Zshははるかに構成可能であり、一般的にはより洗練されています。
_.zshrc
_なしでzshを実行すると、設定オプションを選択できるインタラクティブメニューが起動します。 (一部のディストリビューションではこれが無効になっている可能性があります。その場合は、_autoload zsh-newuser-install; zsh-newuser-install
_を実行します。)推奨される履歴オプションを有効にし、(「新しいスタイル」)完了をオンにし、beep
以外の「一般的なシェルオプション」をオンにすることをお勧めします。後で、発見したオプションをさらに構成します。
²当時、プログラム可能な完了はzshのキラー機能でしたが、bashはすぐにそれを獲得しました。
⁴バージョン4でのみbashで取得された機能(したがって、多くのシステムではまだ利用できません)は小さいタイプです。
また、デフォルトのタブ補完はbashよりも優れています...たとえば...
~/.e.d
TABはzshでは~/.emacs.d/
に展開され、bashはビープ音を鳴らします。
zsh
を使用すると、複数行のコマンドを編集できます( zsh line editor を参照)。bashはできません。同じトリック(Ctrl-p
)、bashは最後のコマンドをフェッチします。
Bashには、次を使用してポートを開くことができるという機能があります。
/dev/tcp/Host/port
または
/dev/udp/Host/port
ただし、Debianではそれが障害と見なされ(パスが実際に存在する場合)、シェルがすべきことの範囲外であるため、無効になっています。 詳細 [debianメーリングリスト]
Bashのwhich
コマンドは、コマンドの場所を明らかにするだけです。
Zshでは、which
はalias
の定義、function
のソース、およびコマンドの場所を明らかにします。
Shellエイリアスがあったとしましょう:
alias gg='git log'
Bashで質問した場合:which gg
結果は無効になります
Zshの場合:which gg
は私たちに与える...
gg: aliased to git log
Shell関数があるとしましょう:
hello() {
echo "Hello World"
}
Bashで質問した場合:which hello
結果は無効になります。
Zshの場合:which hello
は私たちに与える...
hello() {
echo "Hello World"
}
zshcontrib(1)
を介して読み取る多くのものがあり、autoload
- able tetris
ゲームの2つのバージョンを検出できます(もう1つはncurses
)zsh
と完全に一致するようにemacs
と競合して(説明どおり)。
=
キーワードについて言及したいと思います。これはcurl
で苛立ちを引き起こす可能性があります(URLには通常?var=val
が含まれていますが、unsetopt
対応可能だと思います):
q file =less
(gentoo
)はq file $(which less)
に解決されます=
は、問題のコマンドの完全パスに展開されます。
他のことは、頭の中で、正しいRPS1=%d
($PWD
をスタイルで表示すること)です。 Alt + H (run-help
すなわちman
)、 Alt + ? (which-command
)、vared
、およびzed
(autoload
関数)、Emacsのミニバッファーのような Alt + X ウィジェットをバインドせずに実行するには、グローバルエイリアスとサフィックスエイリアス、拡張履歴追跡コマンドの完了期間、-m
と-regex
マッチャー、シェルエミュレーション(例:csh
、ksh
with emulate
)およびautoload
run-help
と組み込みのファイルスニペット。
すべてではないにしても、ほとんどの機能はかなり前に実装されたと思います。変更ログを読むと、大きな変更や新しい機能の追加はなく、非常に悲しいことです(もう探検して発見するものはありません)。
bash
はreadline
(zle
とは対照的に)およびLinuxスピリットのgnu history
でより多く分散されているようです。たとえば、readline関数とキーバインディングは、bash固有のbind
によってオーバーライドされない限り、グローバルに適用できます(~/.inputrc
および/etc/inputrc
に保持されます)。
個人的にはemacs
(特に(現在?)emacs-nox
フレーバーの見込みから)がzsh
やtmux
のような例外的なソフトウェアのインスピレーションであると非常に良い仕事をしたと思いますそのような実装の例である; (X
サーバーを必要としない/依存しないレベルまで)その価値を認める人々のために。 Unix Shellは十分強力であり、その継続性と一貫性は、適切なワークフローと生産性(全体的なコンピューティング)に十分です。