Linuxユーザーとして、私はいつもbashだけを使ってきました。なぜなら、これは私が使用したすべてのディストリビューションのデフォルトです。 BSDなどの他のUnixシステムを使用している人は、他のシェルをより頻繁に使用しているようです。もっと学ぶためにzshを使ってみることにしました。
Bashユーザーとして:
- どの機能を見逃すことができますか?
- 何に注意すべきですか?
答え1
より広い答えを見るには、以下を読んでください。https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences- Between-bash-and-zsh/361957#361957
他のStack Exchangeサイトでは、すでにこのトピックに関する多くの活動があります。私が知っている限り(数年前²)、bashからzshに切り替えた経験は、私が何も見逃していないということです。私はたくさん学んだ。私が最もよく使うと思う単純なzsh関連の機能は次のとおりです。
時々bashを使用するときに最も寂しいzsh機能はautocdです。 zshでそのオプションをオンにした場合、ディレクトリを実行するとは、その
autocd
ディレクトリを変更することを意味します。 ⁴もう一つの非常に便利な機能は素晴らしいワイルドカードです。象形文字は覚えるのが少し難しいですが、
非常にfind
便利です(たとえば、そのコマンドを書くよりも見つけるのが速いことが多い)。より簡単な例:
foo*~*.bak
=foo*
以下を除くすべての一致*.bak
foo*(.)
=一般ファイルのみ一致=ディレクトリのみ一致=ぶら下がっているシンボリックリンクのみ一致=最後の10個のファイルのみ一致=サイズが1 MBを超えるファイルのみ=ディレクトリとfoo*
foo*(/)
そのディレクトリのすべてのディレクトリ中性子ディレクトリから再帰的に⁴foo*
foo*(-@)
foo*
foo*(om[1,10])
foo*
foo*(Lm+1)
dir/**/foo*
foo*
dir
素晴らしい名前を変更するには、
zmv
組み込みの機能が便利です。たとえば、それぞれをfile
次の場所にコピーしますfile.bak
。zmv -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はそれをすぐに獲得しました。
⁴bashがバージョン4でのみ得られた機能(したがって、この回答が公開された時点ではまだ広く利用できず、macOSのシステム提供のbashでは利用できません)はより小さいタイプです。
答え2
zsh
複数行のコマンドを編集できます(参照:zshラインエディタ)、bashはそうではありません。同じトリック(Ctrl-p
)を試みると、bashは最後のコマンドを選択します。
答え3
また、デフォルトのタブ補完機能はbashよりも優れています。たとえば...
~/.e.d
TABはzshに拡張され、~/.emacs.d/
bashではビープ音が鳴ります。
答え4
その中にzshの改善があります。
Bashのコマンドは、which
コマンドの場所のみを表示します。
Zshでは、which
anの定義alias
、aのソース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"
}