zshに移行してみた Ubuntuのシェルをbashより変更

最終更新日

ubuntu

MacOSの標準シェルがzshになって幾数年、bashが使い慣れていたのでUbuntuやMacでもココまで変えずに使ってきましたが、そろそろzshを試してみるのも良いかもと思い、zshへ移行してみました。

zshの方が高機能だということは何となく知識として持っていましたが、移行に特に理由があったわけではなく、時間があったというのと、新しいのを試してみたいという気まぐれの部分が大きいです。

私の環境

cat /etc/os-release

NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
...

移行前に不安だったところ

  • historyが移行できるか
  • コマンドラインを使っているソフト(byobu, Docker, Poetryとか)は変わらず使えるか

問題なしだった

historyは今までの成果としてとても大事なものだったので、これをzshに移行できることが必須条件でしたが、変換スクリプトがありスムーズに作業できたので助かりました。

他では、私の環境では極軽微なエラーが出ましたが、全く問題無いと言っても過言でないレベルでした。
1点だけ、asdfのbashスクリプトを初期設定ファイルの中で実行していたのでこれを無効にしたくらいです。

インストール

sudo apt install zsh

設定

which zshで/usr/bin/zshの場所を一応確認しました。

sudo chsh -s $(which zsh) ユーザ名

設定ファイル .zshrc

.zshrcはこちらを有り難く頂いてしまいました。かなり古い記事でしたがちゃんと動いています。

historyの移行 .zsh_history

bashからzshへの変換スクリプトをGithubへ上げてくれてる人が居ました。有り難いです。
Ruby版もあったのですが、Pythonのmuendelezaji/bash-to-zsh-hist.pyを使わせて頂くことにしました。

ダウンロード後、bash-to-zsh-hist.pyのあるディレクトリで以下を実行

cat ~/.bash_history | python bash-to-zsh-hist.py >> ~/.zsh_history

これでzsh用のhistory履歴ファイルが出来上がりです。

プロンプトの変更 .zshrc

私はパスとプロンプトの間に改行が入っている表示が好みなので変更しました。
設定の書き方は、改行を入れることで、実際の表示も改行してくれます。これは私には盲点で\n${\n}を入れたりして試しても上手く行かなくて、だいぶ時間を浪費してしまいました。

PROMPT="%{${fg[magenta]}%}%n@%m:%{${fg[cyan]}%}%~%{${reset_color}%}
[%? %h]%% "

コピペした設定ファイルでは最後に.zshrc.mineを読み込んでいるので、こちらにrbenvとpyenv, asdf, poetry, fly等の設定をしてみました。

touch .zshrc.mine

# Ruby & rbenvを記入
# Python & pyenvを記入
# flyの設定を記入

設定を有効化

source ~/.zshrc

後で参考にしたいページ

最終的な .zshrc

# users generic .zshrc file for zsh(1)

## Environment variable configuration
#
# LANG
#
export LANG=ja_JP.UTF-8
case ${UID} in
0)
    LANG=C
    ;;
esac


## Default shell configuration
#
# set prompt
#
autoload colors
colors
case ${UID} in
0)
    PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') %B%{${fg[red]}%}%/#%{${reset_color}%}%b "
    PROMPT2="%B%{${fg[red]}%}%_#%{${reset_color}%}%b "
    SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
    ;;
*)
    PROMPT="%{${fg[magenta]}%}%n@%m:%{${fg[cyan]}%}%~%{${reset_color}%}
[%? %h]%% "
    PROMPT2="%{${fg[cyan]}%}%_%%%{${reset_color}%} "
    SPROMPT="%{${fg[cyan]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{${fg[cyan]}%}$(echo ${HOST%%.*} | tr '[a-z]' '[A-Z]') ${PROMPT}"
    ;;
esac

# auto change directory
#
setopt auto_cd

# auto directory pushd that you can get dirs list by cd -[tab]
#
setopt auto_pushd

# command correct edition before each completion attempt
#
setopt correct

# compacked complete list display
#
setopt list_packed

# no remove postfix slash of command line
#
setopt noautoremoveslash

# no beep sound when complete list displayed
#
setopt nolistbeep


## Keybind configuration
#
# emacs like keybind (e.x. Ctrl-a gets to line head and Ctrl-e gets
#   to end) and something additions
#
bindkey -e
bindkey "^[[1~" beginning-of-line # Home gets to line head
bindkey "^[[4~" end-of-line # End gets to line end
bindkey "^[[3~" delete-char # Del

# historical backward/forward search with linehead string binded to ^P/^N
#
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^p" history-beginning-search-backward-end
bindkey "^n" history-beginning-search-forward-end
bindkey "\\ep" history-beginning-search-backward-end
bindkey "\\en" history-beginning-search-forward-end

# reverse menu completion binded to Shift-Tab
#
bindkey "\e[Z" reverse-menu-complete


## Command history configuration
#
HISTFILE=${HOME}/.zsh_history
#HISTFILE=${HOME}/.histfile
HISTSIZE=30000
SAVEHIST=30000
setopt hist_ignore_dups     # ignore duplication command history list
setopt share_history        # share command history data
setopt extended_history     # add time stamp
setopt hist_reduce_blanks   # 余分な空白は詰めて記録
setopt hist_ignore_space    # スペースで始まるコマンド行はヒストリリストから削除
setopt hist_ignore_all_dups # ヒストリに追加されるコマンド行が古いものと同じなら古いものを削除
setopt hist_no_store        # historyコマンドは履歴に登録しない


## Completion configuration
#
fpath=(${HOME}/.zsh/functions/Completion ${fpath})
autoload -U compinit
compinit


## zsh editor
#
autoload zed


## Prediction configuration
#
#autoload predict-on
#predict-off


## Alias configuration
#
# expand aliases before completing
#
setopt complete_aliases     # aliased ls needs if file/dir completions work

alias where="command -v"
alias j="jobs -l"

case "${OSTYPE}" in
freebsd*|darwin*)
    alias ls="ls -G -w"
    ;;
linux*)
    alias ls="ls --color"
    ;;
esac

alias la="ls -a"
alias lf="ls -F"
alias ll="ls -l"

alias du="du -h"
alias df="df -h"

alias su="su -l"

# alias h="history -d" 
alias hg="history 1 | grep "
alias h='history -t "%F %T"'
alias open='xdg-open'

## terminal configuration
#
case "${TERM}" in
screen)
    TERM=xterm
    ;;
esac

case "${TERM}" in
xterm|xterm-color)
    export LSCOLORS=exfxcxdxbxegedabagacad
    export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
    zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
    ;;
kterm-color)
    stty erase '^H'
    export LSCOLORS=exfxcxdxbxegedabagacad
    export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
    zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
    ;;
kterm)
    stty erase '^H'
    ;;
cons25)
    unset LANG
    export LSCOLORS=ExFxCxdxBxegedabagacad
    export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
    zstyle ':completion:*' list-colors 'di=;34;1' 'ln=;35;1' 'so=;32;1' 'ex=31;1' 'bd=46;34' 'cd=43;34'
    ;;
jfbterm-color)
    export LSCOLORS=gxFxCxdxBxegedabagacad
    export LS_COLORS='di=01;36:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
    zstyle ':completion:*' list-colors 'di=;36;1' 'ln=;35;1' 'so=;32;1' 'ex=31;1' 'bd=46;34' 'cd=43;34'
    ;;
esac

# set terminal title including current directory
#
case "${TERM}" in
xterm|xterm-color|kterm|kterm-color)
    precmd() {
        echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
    }
    ;;
esac

## load user .zshrc configuration file
#
[ -f ${HOME}/.zshrc.mine ] && source ${HOME}/.zshrc.mine

高機能ということですが、少しづつ使い方に慣れて、自分なりに拡張していけたらなって思います。

以上になります。またお会いしましょう

鹿児島県の出水市という所に住んでいまして、インターネット周辺で色々活動して行きたいと思ってるところです。 Webサイト作ったり、サーバ設定したり、プログラムしたりしている、釣りと木工好きなMacユーザです。 今はデータサイエンスに興味を持って競馬AI予想を頑張ってます。

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください