インストール - Zsh
ナビゲーションに移動
検索に移動
概要
Zshはシェルの一種で、Linux等の標準シェルであるbashよりも便利な機能を持ったシェルである。
Linuxにてターミナルでコマンドを実行することが多々あるが、zshに切り替えることで、作業効率を上げることができる。
ここでは、Zshの最新版をインストールする方法を記載する。
なお、CentOSのパッケージ管理システムでは、最新のZshをインストール出来ないため、yumは使用しない。
最新のZshはこちらのWebサイトで確認できる。
Zshのインストール
CentOS
まず、CentOSでは、Zshのインストールするにはncurses-develが必要となるので、以下のコマンドを実行してインストールする。
sudo yum install ncurses-devel
次に、Zshの公式WebサイトまたはGitリポジトリから、Zshのソースコードをダウンロードする。
wget https://sourceforge.net/projects/zsh/files/zsh/<バージョン名>/zsh-<バージョン名>.tar.xz/download -O zsh-<バージョン名>.tar.xz tar xvf zsh-<バージョン名>.tar.xz -C zsh-src cd zsh-src または git clone --depth 1 git://git.code.sf.net/p/zsh/code zsh-src cd zsh-src
続いて、Zshをインストールする。(ここでは、ホームディレクトリにインストールしている)
--enable-multibyteオプションは、マルチバイトを有効にするオプションである。
./configure --enable-multibyte --prefix=$HOME/zsh/zsh-<バージョン名> make -j 8 make install
SUSE
CentOSと同様である。
Zshを利用可能にする
Zshを利用可能なシェル一覧に追加する。
ここに追加することで、chshコマンドでシェルの変更が可能となる。
sudo echo /<zshのインストールディレクトリ>/bin/zsh >> sudo /etc/shells
次に、ユーザのシェルを変更する。(コマンドを実行するとパスワードの入力が必要となる)
chsh -s /<zshのインストールディレクトリ>/bin/zsh
再度ログインするか再起動を行う。
すると、以下の文言が表示される。これは、Zshに設定ファイルが存在しないために表示される。
ここでは、 0を入力して空の設定ファイルを作成する。
This is the Z Shell configuration function for new users, zsh-newuser-install. You are seeing this message because you have no zsh startup files(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory~). This function can help you with a few settings that should make your use of the shell easier. You can: (q) Quit and do nothing. The function will be run again next time. (0) Exit, creating the file ~/.zshrc containing just a comment. That will prevent this function being run again. (1) Continue to the main menu. --- Type one of the keys in parentheses ---
Zshの設定例
Zshの設定ファイルを作成した後、以下に示すような設定を記述する。
vi ~/.zshrc
# ~/.zshrcファイル # Ctrl + Dでログアウトしてしまうことを防ぐ setopt IGNOREEOF # 既存のファイルをリダイレクトで上書きしない setopt NOCLOBBER # 日本語を使用 # export LANG=ja_JP.UTF-8 # パスを追加したい場合 # export PATH="$HOME/bin:$PATH" # 色を使用 autoload -Uz colors colors # 自動補完を有効にする # コマンドの引数やパス名を途中まで入力して <Tab> を押すといい感じに補完してくれる # 例: `cd path/to/<Tab>`, `ls -<Tab>` autoload -Uz compinit compinit # Emacs ライクな操作を有効にする(文字入力中に Ctrl-F,B でカーソル移動など) # Vi ライクな操作が好みであれば `bindkey -v` とする bindkey -e # 他のターミナルとヒストリーを共有 setopt share_history # ヒストリーに重複を表示しない setopt HIST_IGNORE_ALL_DUPS # 重複している行は無視する setopt HIST_IGNORE_DUPS # 履歴ファイルから空の行を削除する setopt HIST_REDUCE_BLANKS # 空白から始めたコマンドを無視 setopt HIST_IGNORE_SPACE # historyコマンドとfcコマンドを履歴に追加しない setopt HIST_NO_STORE HISTFILE=~/.zsh_history HISTSIZE=100 SAVEHIST=100 # 入力したコマンドが存在せず、かつディレクトリ名と一致するなら、ディレクトリに cd する # 例: /usr/bin と入力すると /usr/bin ディレクトリに移動 setopt auto_cd # cd した先のディレクトリをディレクトリスタックに追加する # ディレクトリスタックとは今までに行ったディレクトリの履歴のこと # `cd +<Tab>` でディレクトリの履歴が表示され、そこに移動できる setopt auto_pushd # pushdから重複を削除 setopt pushd_ignore_dups # コマンドミスを修正 setopt correct # グローバルエイリアス alias -g cd=' cd -P' alias -g rm='rm -iv' alias -g cp='cp -i' alias -g mv='mv -iv' alias -g ls=' ls -hlvF --group-directories-first --color' alias -g cat=' cat -n' alias -g less=' less -n' alias -g grep=' grep -i' alias -g en=' LANG=C LANGUAGE=C LC_ALL=C' alias -g jp='LANG=ja_JP.UTF-8' alias -g mount='mount -o ro,noload' alias -g umount='umount -fl' alias -g nano='nano -lmS' alias -g L='| less' alias -g H='| head' alias -g G='| grep' alias -g GI='| grep -ri' alias -g D='--detail' # エイリアス alias which=' which' alias clear=' clear && echo -en "\e[3J"' alias hclear=' echo -n > ~/.zsh_history && fc -p ~/.zsh_history' alias igrep=' sudo zypper search -i' alias repoclean=' sudo zypper clean -a' alias skate='kdesu /usr/bin/kate' alias scode='code --user-data-dir=$HOME/Program/VScode_root_project' alias suse=' cat /etc/SUSE-brand' alias upoweroff=' sudo systemctl poweroff' alias ureboot=' sudo systemctl reboot' alias startx=' startx' alias exit=' exit' alias startnm=' sudo systemctl stop wickedd wicked; sudo systemctl start NetworkManager' alias startwicked=' sudo systemctl stop NetworkManager; sudo systemctl start wickedd wicked' alias plasma=" killall plasmashell; plasmashell > /dev/null 2>&1 & disown" alias sshpi='ssh <ユーザ名>@<ホスト名またはIPアドレス> -p <ポート番号> -i <暗号鍵ファイルのフルパス>' alias sshsakura=' sshpass -p <パスワード> ssh <ユーザ名>@<ホスト名またはIPアドレス> -p <ポート番号>' # FreeRDPをインストールしている場合 alias rwin10=' $HOME/InstallSoftware/FreeRDP/freerdp-nightly/bin/xfreerdp /u:<仮想マシンのユーザ名> /p:<パスワード> /w:1600 /h:900 +clipboard /sound:rate:44100,channel:2 /drive:<共有ディレクトリ名>,<共有ディレクトリのフルパス> /v:<仮想マシンのIPアドレス>' # backspace,deleteキーを使えるように stty erase ^H bindkey "^[[3~" delete-char # cdの後にlsを実行 chpwd() { ls -hlFtr --color=auto } # どこからでも参照できるディレクトリパス cdpath=(~) # 区切り文字の設定 autoload -Uz select-word-style select-word-style default zstyle ':zle:*' word-chars "_-./;@" zstyle ':zle:*' word-style unspecified # Ctrl + sのロック, Ctrl + qのロック解除を無効にする setopt no_flow_control # プロンプトを2行で表示、時刻を表示 PROMPT="%(?.%{${fg[green]}%}.%{${fg[red]}%})%n${reset_color}@${fg[blue]}%m${reset_color}(%*%) %~%# " # または PROMPT="%(?.%{${fg[red]}%}.%{${fg[red]}%})%n${reset_color}@${fg[green]}%m${reset_color}(%*%) > " # <Tab> でパス名の補完候補を表示した後、続けて<Tab>を押すと候補からパス名を選択できるようになる # 補完後、メニュー選択モードになり左右キーで移動が出来る zstyle ':completion:*:default' menu select=2 # 補完で大文字にもマッチ zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # Ctrl+rでヒストリーのインクリメンタルサーチ、Ctrl+sで逆順 bindkey '^r' history-incremental-pattern-search-backward bindkey '^s' history-incremental-pattern-search-forward # コマンドを途中まで入力後、historyから絞り込み # 例 ls まで打ってCtrl+pでlsコマンドをさかのぼる、Ctrl+bで逆順 autoload -Uz 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 "^b" history-beginning-search-forward-end # cdrコマンドを有効 ログアウトしても有効なディレクトリ履歴 # cdr タブでリストを表示 autoload -Uz add-zsh-hook autoload -Uz chpwd_recent_dirs cdr add-zsh-hook chpwd chpwd_recent_dirs # cdrコマンドで履歴にないディレクトリにも移動可能に zstyle ":chpwd:*" recent-dirs-default true # 複数ファイルのmv 例 zmv *.txt *.txt.bk autoload -Uz zmv alias zmv='noglob zmv -W' # 改行のない出力をプロンプトで上書きするのを防ぐ unsetopt promptcr # mkdirとcdを同時実行 function mkcd() { if [ "$#" -eq 0 ]; then echo "Too few arguments!" elif [ "$#" -eq 1 ]; then if [ -d $1 ]; then echo "$1 already exists!" cd $1 else mkdir -p $1 && cd $1 fi else echo "Too many arguments!" fi } # manコマンドの結果をfirefoxで閲覧 function manh() { if [ "$#" -eq 0 ]; then echo "Too few arguments!" elif [ "$#" -eq "1" ]; then man --html=firefox $1 & else echo "Too many arguments!" fi } # KVMの起動 function startkvm { KVM_STATUS=$(sudo systemctl status libvirtd | grep "Active:" | grep -ie "dead") if [ -n "KVM_STATUS" ]; then sudo systemctl start libvirtd fi NETWORK_STATUS=$(sudo virsh net-info default | grep -ie "起動中" -ie "Active" | grep -ie "no") if [ -n "$NETWORK_STATUS" ]; then sudo virsh net-start default fi } # KVMの停止 function stopkvm { NETWORK_STATUS=$(sudo virsh net-info default | grep -ie "起動中" -ie "Active" | grep -ie "yes") if [ -n "$NETWORK_STATUS" ]; then sudo virsh net-destroy default fi KVM_STATUS=$(sudo systemctl status libvirtd | grep "Active:" | grep -ie "running") if [ -n "KVM_STATUS" ]; then sudo systemctl stop libvirtd libvirtd.socket libvirtd-admin.socket libvirtd-ro.socket fi } # カレントディレクトリに存在するディレクトリとファイルの検索 function lgrep() { if [ "$#" -eq "1" ]; then for OBJECT in $(\ls -aA --group-directories-first | \grep -iE "${1}") do ls -AdhlF --color "${OBJECT}" done echo "" elif [ "$#" -eq "2" ]; then disable -f chpwd CURRENTDIR=$(pwd) cd ${1}; for OBJECT in $(\ls -aA --group-directories-first | \grep -iE "${2}") do #(unset -f chpwd; cd ${1}; ls -AdhlF --color "${OBJECT}") ls -AdhlF --color "${OBJECT}" done cd ${CURRENTDIR} echo "" enable -f chpwd else echo "Specify Arguments." fi unset -v CURRENTDIR OBJECT return 0 } # 環境変数PATHの設定 function SetPATH() { BEFORE_HOME='$HOME' AFTER_HOME="$HOME" PATH_NAME=$(echo ${1//"$BEFORE_HOME"/"$AFTER_HOME"}) SLASH=$(echo ${PATH_NAME: -1:1}) if [ $SLASH = "/" ]; then LENGTH="${#PATH_NAME}" let LENGTH=$LENGTH-1 PATH_NAME=$(echo ${PATH_NAME:0:$LENGTH}) fi if [ ! -d $PATH_NAME ]; then echo "No Exist Directory $PATH_NAME" return 1 fi EXIST_FLAG=0 for VALUE in ${(s/:/)PATH} do if [ "$VALUE" = "$PATH_NAME" ]; then EXIST_FLAG=1 break fi done if [ "$EXIST_FLAG" -eq 0 ]; then export PATH="$PATH_NAME:$PATH" elif [ $EXIST_FLAG -eq 1 ]; then echo "Already Exist $PATH_NAME in PATH " 1>&2 fi unset -v SLASH LENGTH BEFORE_HOME AFTER_HOME PATH_NAME EXIST_FLAG VALUE return 0 } function SetLIBRARY() { BEFORE_HOME='$HOME' AFTER_HOME="$HOME" PATH_NAME=$(echo ${1//"$BEFORE_HOME"/"$AFTER_HOME"}) SLASH=$(echo ${PATH_NAME: -1:1}) if [ $SLASH = "/" ]; then LENGTH="${#PATH_NAME}" let LENGTH=$LENGTH-1 PATH_NAME=$(echo ${PATH_NAME:0:$LENGTH}) fi if [ ! -d $PATH_NAME ]; then echo "No Exist Directory $PATH_NAME" return 1 fi EXIST_FLAG=0 for VALUE in ${(s/:/)LD_LIBRARY_PATH} do if [ "$VALUE" = "$PATH_NAME" ]; then EXIST_FLAG=1 break fi done if [ $EXIST_FLAG -eq 0 ]; then export LD_LIBRARY_PATH="$PATH_NAME:$LD_LIBRARY_PATH" elif [ $EXIST_FLAG -eq 1 ]; then echo "Already Exist $PATH_NAME in LD_LIBRARY_PATH " 1>&2 fi unset -v SLASH LENGTH BEFORE_HOME AFTER_HOME PATH_NAME EXIST_FLAG VALUE return 0 } # git設定 RPROMPT="%{${fg[blue]}%}[%~]%{${reset_color}%}" autoload -Uz vcs_info setopt prompt_subst zstyle ':vcs_info:git:*' check-for-changes true zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!" zstyle ':vcs_info:git:*' unstagedstr "%F{red}+" zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f" zstyle ':vcs_info:*' actionformats '[%b|%a]' precmd () { vcs_info } RPROMPT=$RPROMPT'${vcs_info_msg_0_}'