web-dev-qa-db-ja.com

zshにはどの機能があり、bashにはありませんか、またはその逆ですか?

Linuxユーザーとして、私は常にbashを使用してきました。これは、使用したすべてのディストリビューションのデフォルトであったためです。 BSDなどの他のUnixシステムを使用している人々は、他のシェルをはるかに頻繁に使用しているようです。もう少し学ぶために、zshを試すことにしました。

Bashユーザーとして:

  • 見逃す機能はありますか?
  • そして、私は何に注意する必要がありますか?
63
Macha

他の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.dTABはzshでは~/.emacs.d/に展開され、bashはビープ音を鳴らします。

11
ocodo

zshを使用すると、複数行のコマンドを編集できます( zsh line editor を参照)。bashはできません。同じトリック(Ctrl-p)、bashは最後のコマンドをフェッチします。

10
Pedro Silva

Bashには、次を使用してポートを開くことができるという機能があります。

/dev/tcp/Host/port

または

/dev/udp/Host/port

ただし、Debianではそれが障害と見なされ(パスが実際に存在する場合)、シェルがすべきことの範囲外であるため、無効になっています。 詳細 [debianメーリングリスト]

8
Portablejim

どちらか-zshで拡張

Bashのwhichコマンドは、コマンドの場所を明らかにするだけです。

Zshでは、whichaliasの定義、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"
}
2
ocodo

zsh-完全なシェル

zshcontrib(1) を介して読み取る多くのものがあり、autoload- able tetrisゲームの2つのバージョンを検出できます(もう1つはncurseszshと完全に一致するようにemacsと競合して(説明どおり)。

=

=キーワードについて言及したいと思います。これはcurlで苛立ちを引き起こす可能性があります(URLには通常?var=valが含まれていますが、unsetopt対応可能だと思います):

  • q file =lessgentoo)はq file $(which less)に解決されます

=は、問題のコマンドの完全パスに展開されます。

他のグッズ

他のことは、頭の中で、正しいRPS1=%d$PWDをスタイルで表示すること)です。 Alt + Hrun-helpすなわちman)、 Alt + ?which-command)、vared、およびzedautoload関数)、Emacsのミニバッファーのような Alt + X ウィジェットをバインドせずに実行するには、グローバルエイリアスとサフィックスエイリアス、拡張履歴追跡コマンドの完了期間、-m-regexマッチャー、シェルエミュレーション(例:cshksh with emulate)およびautoloadrun-helpと組み込みのファイルスニペット。

嘆き

すべてではないにしても、ほとんどの機能はかなり前に実装されたと思います。変更ログを読むと、大きな変更や新しい機能の追加はなく、非常に悲しいことです(もう探検して発見するものはありません)。

bashreadlinezleとは対照的に)およびLinuxスピリットのgnu historyでより多く分散されているようです。たとえば、readline関数とキーバインディングは、bash固有のbindによってオーバーライドされない限り、グローバルに適用できます(~/.inputrcおよび/etc/inputrcに保持されます)。

結論

個人的にはemacs(特に(現在?)emacs-noxフレーバーの見込みから)がzshtmuxのような例外的なソフトウェアのインスピレーションであると非常に良い仕事をしたと思いますそのような実装の例である; (Xサーバーを必要としない/依存しないレベルまで)その価値を認める人々のために。 Unix Shellは十分強力であり、その継続性と一貫性は、適切なワークフローと生産性(全体的なコンピューティング)に十分です。

0
user86041