bashからzshへの移行[終了]


143

私は頻繁にzshを称賛する投稿に出くわすので、bashからzshへの移行を検討しています。私は経験豊富なコマンドラインユーザーであり、基本はほとんど同じであると想定しているため、移動のメリットを得るためのアドバイスと、知っておくべき落とし穴を探しています。

回答ごとに少しアドバイスをお願いします。私は戻って来て、一度にすべてを学ぼうとするのではなく、安定したペースでシェルの使用に余分な情報を統合できる一口サイズのチャンクを探しています。


8
Ubuntuのcommand-not-foundをzshと統合できるかどうかを知りたいです。このため(そして他の多くの迷惑行為のため)、bashに戻りました。
マリウスゲドミナス


さらに2つの興味深いリンク:「ZSH FAQ」zsh.sourceforge.net/FAQ&「ZSHはあなたの友達」mikegrouchy.com/blog/zsh-is-your-friend.html
Shadok

3
@MariusGedminas:(ここから)zshはこれをサポートしますが、手動で有効にする必要があります。に追加source /etc/zsh_command_not_foundするだけ.zshrcです。
naught101 14

回答:


94

あなたが言うzshように、多くの点でに似ていbashます。にはないいくつかの機能bashがあり、強力な方法で拡張できます。動くことを一種の革命としてではなく、日々の仕事に役立つ一連の進化的なステップとして考えてください。ここに私からのヒントがあります.zshrc。あなたはアドバイスを一つだけ好むと言いますが、この投稿は長いリストです。それでも、ポイントを1つずつ確認することをお勧めします。に興味深いビットを追加して~/.zshrc、でリロードするだけsource ~/.zshrcです。最後のヒント:zshのデフォルト(「Emacs」)キーボードショートカットのキーストロークを学習します^A ^E ^W Alt-F Alt-B Alt-P ^L ^RAlt2つの別々のキーストロークで置き換えることができます:Alt-Pと同等ESC Pです。


これにより、より広範なタブ補完が可能になります。

autoload -U compinit
compinit

両端からのタブ補完。

setopt completeinword

タブ補完では大文字と小文字が区別されません。

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

killallのより良い補完。

zstyle ':completion:*:killall:*' command 'ps -u $USER -o cmd'

^ Wなどを使用して、「単語」の定義を変更します。

autoload select-word-style
select-word-style shell

lsの色。

if [[ -x "`whence -p dircolors`" ]]; then
  eval `dircolors`
  alias ls='ls -F --color=auto'
else
  alias ls='ls -F'
fi

lsのショートカット。

alias ll='ls -l'
alias la='ls -a'

すべてのオープンシェルの1つの履歴。10,000エントリを保存します。これにより、前回使用したコマンドなどを見つけるための便利なメモリ補助になります./configure。Alt-P(このように開始するコマンドを見つける)と^ R(履歴を検索する)を自由に使用してください。

HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory

ls ** / *。txt(すべてのテキストファイルを検索)など、すべての種類の拡張グロビングを有効にしますls -d *(D)(「。」で始まるファイルを含むすべてのファイルを表示します)。詳細についてはman zshexpn、セクション「ファイル名の生成」に進んでください。

# superglobs
setopt extendedglob
unsetopt caseglob

これは、コマンドを実行せずに履歴に記憶するのに役立ちます。

setopt interactivecomments # pound sign in interactive prompt

「cd ..」の代わりに「..」、「cd / usr / include」の代わりに「/ usr / include」と入力します。

setopt auto_cd

素敵なプロンプト。

PS1='[%T] %n@%m:%~# '

10秒以上かかるコマンドのCPU使用状況の統計を表示する

REPORTTIME=10

Ubuntuで広範囲に使用するコマンド。

alias 'a=sudo aptitude'
alias 'ai=sudo aptitude install'
alias 'ar=sudo aptitude remove'
alias 'au=sudo aptitude update'
alias 'ag=sudo aptitude safe-upgrade'
alias 'as=apt-cache search'
alias 'aw=apt-cache show'

サイズでソートされたパッケージをリストします-どのパッケージがディスク容量を占有しているかを決定するときに役立ちます。

function apt-list-packages {
  dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print $1" "$2}'
}

6
有用であるために+1。-1不正なemacsアドボカシーの場合!
トリプティク

2
また、多くのプラグインをzshに追加する[ github.com/robbyrussell/oh-my-zsh](oh-my-zsh)も好きかもしれません。
RedPixel 14

14

私は本をbashからZ Shellに推薦します。シェルの切り替えに必要なすべてのアドバイスが含まれています。両方のシェルの違いを説明し、新しいzsherを簡単にします。


この本は、bashユーザーとzshユーザーの両方に最適です。「すべてこれを行うことができますbashのとzshの両方」と、その後の別の30ページにつながる「と、ここでzshの唯一のものだ」あなたは、各章で始まるか好きにしなければならないの
リック

8

ここに私の.zshrcがあり、それが最も重要なことです!zshには使用できるオプションがたくさんあるので、ネット上のすべての例の一部を見るか、Zshホームページのドキュメントを読んでください。

私の.zshrcには、コマンドラインの右側のタイムスタンプ以外の本当にクールなものは含まれていません。

ところで、ここにいくつかの例があるたびにタブ補完を試してください:

mplayer -a[tab]

次のようなものが表示されます。

mplayer -a
 -ac                 -- force usage of a specific audio codec
 -af                 -- activate audio filters
 -afm                -- force usage of a specific audio codec family
 -alang              -- select the DVD audio language
 -ao                 -- specify audio driver
 -aop                -- specify audio output filter

また、パスワードなしのssh-keysまたはssh-agentを使用している場合、リモートファイルをタブ補完するのに便利です。

scp apollo:/home/user/[tab]
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/

リストを取得したら、Tabキーをさらに数回押して、さまざまな可能性を循環できます。

ただし、このシェルを使用すると、標準のシェルが愚かで迷惑だと感じるようになります。


5

いくつかの特に有用な拡張グロブ:

1-- rmdir *(/^F)現在のディレクトリの下にある空でないディレクトリをすべて削除する

2-- grep traceback /srv/log/**/*(.m-2)過去2日間に変更されたファイルでこの正規表現を探す

3-- chmod g+w **/*(U^I)私が所有し、グループ書き込み可能ではないファイルをグループ書き込み可能にする

はい、もちろんこれを書くことはできますがfind、これは簡単です。公平を期すと、コマンドラインにすべて展開されるという2つの欠点があります。数千のファイルに一致すると、コマンドラインが長くなりすぎて失敗し、次にすべてのファイルが見つかります。ファイルの実行開始前。

setopt extendedglobまだオンになっていない場合は必要になります)


4

私はbashについてあまり知りませんので、私は同情できません。私のzsh設定ファイルからのいくつかのスニペット。

いくつかの設定

HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000
REPORTTIME=10 # print elapsed time when more than 10 seconds
setopt NO_HUP
setopt NO_LIST_BEEP
setopt LOCAL_OPTIONS # allow functions to have local options
setopt LOCAL_TRAPS # allow functions to have local traps
setopt HIST_VERIFY
setopt SHARE_HISTORY # share history between sessions ???
setopt EXTENDED_HISTORY # add timestamps to history
setopt PROMPT_SUBST
setopt CORRECT
setopt COMPLETE_IN_WORD
setopt IGNORE_EOF

setopt APPEND_HISTORY # adds history
setopt INC_APPEND_HISTORY SHARE_HISTORY  # adds history incrementally and share it across sessions
setopt HIST_IGNORE_ALL_DUPS  # don't record dupes in history
setopt HIST_REDUCE_BLANKS
# Leave some chars out of the out of WORDCHARS so ^W acts more nicely 
WORDCHARS='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?'

プロンプトのGit

if [[ -n $SSH_CONNECTION ]]; then
  export PS1='%m:%3~$(git_info_for_prompt)%# '
else
  export PS1='%3~$(git_info_for_prompt)%# '
fi

一部のホットキーは、行の先頭にテキストを挿入します。

insert_sudo     () { zle beginning-of-line; zle -U "sudo "         }
insert_apt      () { zle beginning-of-line; zle -U "sudo apt-get " }
insert_gem      () { zle beginning-of-line; zle -U "sudo gem "     }
insert_install  () { zle -U "install "     }

zle -N insert-sudo      insert_sudo
zle -N insert-apt       insert_apt
zle -N insert-gem       insert_gem
zle -N insert-install   insert_install

bindkey "^B" insert-gem
bindkey "^N" insert-install
bindkey "^k" insert-sudo
bindkey "^a" insert-apt

関数は、〜/ .zsh / functionsに保存します

git_info_for_prompt

local g="$(git rev-parse --git-dir 2>/dev/null)"
if [ -n "$g" ]; then
  local r
  local b
  if [ -d "$g/../.dotest" ]
  then
    if test -f "$g/../.dotest/rebasing"
    then
      r="|REBASE"
    elif test -f "$g/../.dotest/applying"
    then
      r="|AM"
    else
      r="|AM/REBASE"
    fi
    b="$(git symbolic-ref HEAD 2>/dev/null)"
  elif [ -f "$g/.dotest-merge/interactive" ]
  then
    r="|REBASE-i"
    b="$(cat "$g/.dotest-merge/head-name")"
  elif [ -d "$g/.dotest-merge" ]
  then
    r="|REBASE-m"
    b="$(cat "$g/.dotest-merge/head-name")"
  elif [ -f "$g/MERGE_HEAD" ]
  then
    r="|MERGING"
    b="$(git symbolic-ref HEAD 2>/dev/null)"
  else
    if [ -f "$g/BISECT_LOG" ]
    then
      r="|BISECTING"
    fi
    if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
    then
      if ! b="tag: $(git describe --exact-match HEAD 2>/dev/null)"
      then
        b="$(cut -c1-7 "$g/HEAD")..."
      fi
    fi
  fi

  if [ -n "$1" ]; then
    printf "$1" "${b##refs/heads/}$r"
  else
    printf "[%s]" "${b##refs/heads/}$r"
  fi
fi

いくつかのgithubオプション

#compdef github

_github() {
  if (( CURRENT > 2 )); then
    # shift words so _arguments doesn't have to be concerned with second command
    (( CURRENT-- ))
    shift words
    # use _call_function here in case it doesn't exist
    _call_function 1 _github_${words[1]}
  else
    _values "github command" \
     "fetch[Fetch from a remote to a local branch.]" \
     "ignore[Ignore a SHA (from 'github network commits')]" \
     "fetch_all[Fetch all refs from a user]" \
     "info[Info about this project.]" \
     "browse[Open this repo in a web browser.]" \
     "home[Open this repo's master branch in a web browser.]" \
     "clone[Clone a repo.]" \
     "pull-request[Generate the text for a pull request.]" \
     "network[Project network tools.]" \
     "pull[Pull from a remote.]" \
     "track[Track another user's repository.]"
  fi
}

_github_pull() {
  _arguments \
    "--merge[Automatically merge remote's changes into your master.]"
}
_github_clone() {
  _arguments \
    "--ssh[Clone using the git@github.com style url.]"
}

_github_track() {
  _arguments \
    "--private[Use git@github.com: instead of git://github.com/.]" \
    "--ssh[Equivalent to --private.]"
}

_github_network() {
  if (( CURRENT > 2 )); then
    # shift words so _arguments doesn't have to be concerned with second command
    (( CURRENT-- ))
    shift words
    # use _call_function here in case it doesn't exist
    _call_function 1 _github_network_${words[1]}
  else
    _values "github network command" \
     "web[Open network in a web browser.]" \
     "list[List networked repositories.]" \
     "fetch[Fetched commits for a given networked repository.]" \
     "commits[List networked commits not pulled into this repo.]"
  fi
}

_github_network_commits() {
  _arguments \
    "--project[Filter commits on a certain project.]" \
    "--author[Filter commits on a email address of author.]" \
    "--common[Show common branch point.]" \
    "--nocache[Do not use the cached network data.]" \
    "--sort[How to sort : date(*), branch, author.]" \
    "--thisbranch[Look at branches that match the current one]" \
    "--applies[Filter commits to patches that apply cleanly.]" \
    "--limit[Only look through the first X heads - useful for really large projects]" \
    "--before[Only show commits before a certain date.]" \
    "--after[Only show commits after a certain date.]" \
    "--shas[Only show shas.]" \
    "--cache[Use the network data even if it's expired.]" \
    "--noapply[Filter commits to patches that do not apply cleanly.]"
}

3

私は同じ旅行にいます:)

これまでのところ、適切な構成ファイル(.zshrc)が必要であることがわかりました。

これを例としてhttp://matt.blissett.me.uk/linux/zsh/zshrc、コメントを見て、ハックしてください。Stackoverflowとseverphault、そして検索するのにも良い場所。

私はまだhttp://dotfiles.org/.zshrcに飛び込んではいませんが、そんなに時間はありません:)


3

zshの拡張グロブと再帰的グロブについて学びます。

zstyleについて少し学び、zstyleを使用してさまざまなもの(特に完了)を使用して構成を調整する方法を学びます。

連想配列を調べます。また、標準配列(bashとの違いに注意してください!)

正規表現を使用する場合、=~(bashにもある)を調べて検討してください。setopt rematch_pcre

zshの魔法の少し以上に依存するスクリプトを書くことは避けてください。使用するのは素晴らしいことですが、zshは書き込み専用になる傾向があるためです。あまりにも多く使用している場合は、Pythonなどの言語にいつ切り替えるかを考えてください。

Zshは魅惑的です。ダークサイドです。ようこそ。


2

大きな利点-多くのコマンド用の事前にパッケージ化された補完スクリプトによる優れたタブ補完。の出力を示す例はapt-get<TAB>次のとおりです。

apt-get
action
autoclean        build-dep        clean            dselect-upgrade  install          remove           update           
autoremove       check            dist-upgrade     help             purge            source           upgrade          

1

私は話のクーペを与え、数人をzshに変えました。ここでは、スターターと自分のzsh構成のコピーの両方と共に、メモ(利点)のgithubリポジトリを保持しています。

http://github.com/mitechie/zshrc


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