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


62

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

bashユーザーとして:

  • どの機能が恋しいですか?
  • そして、私は何に注意する必要がありますか?


5
@Gillesいつかすべてのものはここに移動...と合併していていいかもしれない
xenoterracide

回答:


45

他のStack Exchangeサイトのトピックについては、すでにかなりの活動が行われています。覚えている限り(bashからzshへ)の切り替えの私の経験(何年も前²)で、私は1つのことを見逃していませんでした。私は多くを得ました。以下は、私が最もよく使用するシンプルなzsh固有の機能です。

  • zshの機能I私はたまにはbashを使用するほとんどのミスはautocdです:zshの中で、ディレクトリを実行すると、あなたがオンに提供し、それに変更することを意味autocdoption.⁴

  • 別の非常に便利な機能は、派手なグロビングです。象形文字の文字は、(のように、それは同等書くことよりも、それらをルックアップするために頻繁に高速ですビット覚えにくいが、非常に便利なfindコマンド)。いくつかの簡単な例:
        foo*~*.bak=一致するfoo*ものを除くすべての一致*.bak
        foo*(.)=一致する通常のファイルのみ=一致するfoo*
        foo*(/)ディレクトリfoo*
        foo*(-@)のみ= 一致するぶら下がっているシンボリックリンクのみfoo*
        foo*(om[1,10])=一致する最新の10個のファイルfoo*
        foo*(Lm+1)= 1MBを超えるファイルのみ= ディレクトリ内およびそのすべてサブディレクトリ、再帰的に
        dir/**/foo*foo*dir

  • 派手な名前の変更には、zmvビルトインが便利です。たとえば、すべてfileをにコピーするにはfile.bakzmv -C '(*)(#q.)' '$1.bak'

  • bashとzshの両方には、適切な完了システムがあり、明示的に(. /etc/bash_completionまたはautoload -U compinit; compinit)オンにする必要があります。Zshの方がはるかに構成可能であり、一般的にはより洗練されています。

なしでzshを実行すると.zshrc、構成オプションを選択できる対話型メニューが起動します。(一部のディストリビューションではこれが無効になる場合がありますautoload zsh-newuser-install; zsh-newuser-install。その場合は実行してください。)推奨される履歴オプションを有効にし、(「新しいスタイル」)補完を有効にし、を除く「共通シェルオプション」を有効にすることをお勧めしますbeep。後で、発見したオプションをさらに構成します。

² 当時、プログラム可能な完了はzshのキラー機能でしたが、bashはすぐにそれを取得しました。
b バージョン4でのみbashが取得した機能(多くのシステムではまだ利用できない)は、より小さなタイプです。


5
Bash 4.0は、autocd上記で説明した機能をサポートするようになりました。コマンドを使用して機能を有効にしますshopt -s autocd。その後、機能は説明したとおりに機能します。
Philluminati

zshには組み込みwhereコマンドもありますが、コマンドと混同しないでくださいwhich
シルドレス

@EdGrimm私はGNUとFreeBSDが行うことができます見つけることだと思うのzshグロブ修飾子(で行うことができますすべてのもの-execとの選択のようなもののためのシェルのeなどのツールへのパイプラインsortsedを書き換えeおよびソート)。もちろん、もっと冗長です。
ジル「SO-悪であるのをやめる」

10年以上にわたって検索マンページをチェックして再チェックした後、私は本当に見ているのをやめたと思います。ただし、コメントする前に最後に確認したことがあれば、少なくとも-sizeオプションが単位をバイト単位に減らすようになったことを見ていたでしょう。
エドグリム

11

また、デフォルトのタブ補完はbashよりも優れています...たとえば...

~/.e.dTABは~/.emacs.d/zshに展開され、bashはビープ音を鳴らします。


しなかった。setoptそのためにデフォルト以外のオプションを使用しますか(もしあれば)?

_-.ワイルドカードとして設定していることに気付きました。 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' stackoverflow.com/q/7906078/311660を
ocodo

10

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


2
少なくともバージョン4.2.37の時点で、Bashはこれを行います。改行をセミコロンに置き換え、編集する単一の行を提供します。
キーストンプソン14年

1
まだそれほど良くありません。(:
SilverWolf

8

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

/dev/tcp/host/port

または

/dev/udp/host/port

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


5
zshにはztcpが組み込まれていますが、これにはbashの/ dev / tcpよりも多くの機能があり、/ dev / udpはありません。私はむしろsocatを使用します。
ステファンシャゼラス

2

which-zshで強化

whichbash のコマンドは、コマンドの場所のみを明らかにします。

Zsh では、whichanの定義、aliasaのソース、functionおよびコマンドの場所が明らかになります。

シェルエイリアスがあったとしましょう:

alias gg='git log'

Bashでは、私たちが尋ねた場合:which gg結果は無効になります

Zshのでは:which gg私たちを与えるだろう...

gg: aliased to git log

シェル関数があったとしましょう:

hello() {
    echo "Hello World"
}

Bashで質問した場合:which hello結果は無効になります。

Zshのでは:which hello私たちを与えるだろう...

hello() {
    echo "Hello World"
}

Bashはtype(ビルトイン)コマンドを介して同じ機能を提供します。そして、ひと言で言えばwhich、外部コマンドであり、bash ビルトインではありません。
ソン-ランゲン


0

zsh-完全なシェル

多くの場合、zshcontrib(1)1つを読むことで- と競合する2つのバージョンのautoload-able tetrisゲーム(もう1つは)を検出し、完全性を保つことができます(説明を参照)。ncurseszshemacs

=

=刺激を引き起こす可能性のあるキーワードに言及したいと思いcurlます(URLは通常?var=valそれらに含まれていますが、それは可能unsetoptだと思います):

  • q file =lessgentoo)解決するq file $(which less)

= 問題のコマンドのフルパスに展開します。

他のグッズ

他のことは、心の外で、正しいプロンプトRPS1=%d$PWDスタイルで表示する)、Alt + Hrun-helpつまり、man)、Alt + ? which-command)、、varedおよびzedautoload関数)、Alt + Xウィジェットをバインドせずに実行するEmacsのミニバッファのようなもの、グローバルおよびサフィックスエイリアス、拡張された履歴追跡コマンド完了時間、-mおよび-regexマッチャー、シェルエミュレーション(例えばcshkshemulate)およびautoload run-help組み込み関数のファイルスニペットを持ちます。

嘆き

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

bash(とは対照的に)およびlinuxの精神により多く分布しているようです。たとえば、bash-specificによってオーバーライドされない場合、readline関数とキーバインドは(andに保持されているように)グローバルに適用できます。readlinezlegnu history~/.inputrc/etc/inputrcbind

結論

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.