bashからzshへの乗り換え

提供: Akionux-wiki
Share/Save/Bookmark
移動先: 案内検索

概要

2014年10月現在、bashのshellshock脆弱性が問題になっている。 そこで、この際いっそのことbashからzshへ切り替えてみようと考えた。 ここではbashからzshへ切り替える方法を説明する。

/bin/shは多くのディストリビューションでは/bin/bashへのシンボリックリンクとなっている。 /bin/shはどのシェルでも良いのだが、できるだけPOSIXの仕様に沿ったものであることが望ましい。 zshはPOSIX拡張のようなので、bashからzshへ切り替えてもそれほど問題はないと思われる。ただshebangが/bin/shな既存のスクリプトに何らかの問題が起こる可能性は無いとは言えない。

環境

Slackware 14.0

gitからインスト―ル

Yodlのインストール

まずはYodlのビルドに必要なicmakeをインストールする。もしすでに適切なバージョンのicmakeがインストールされているなら不要。

wget "http://downloads.sourceforge.net/project/icmake/icmake/7.21.00/icmake_7.21.00.orig.tar.gz"
tar zxvf icmake_7.21.00.orig.tar.gz
cd icmake-7.21.00/
./icm_bootstrap /
sudo icm_install all
rm -rf tmp/

Yodlをダウンロード・インストール。

wget "http://downloads.sourceforge.net/project/yodl/yodl/3.03.0/yodl_3.03.0.orig.tar.gz"
tar zxvf yodl_3.03.0.orig.tar.gz
cd yodl-3.03.0/
./build programs
sudo ./build install programs

zshのインストール

git clone git://git.code.sf.net/p/zsh/code zsh
cd zsh/
git tag
git checkout zsh-5.0.6
#autoscan
#cp configure.scan configure.in
autoconf
autoheader

ここではシステムのルートフォルダへインストールする。 私の場合基本的にパッケージ管理システムを使っていないのでルートフォルダへインストールしているが、パッケージ管理システムを使う場合はディストリビュータ提供のzshと衝突するので、次の./configureスクリプトのオプションは--prefix=/usr/localか--prefix=/usrが良いだろう。

./configure --prefix=/

ここで、デフォルトではドキュメントをYodlで生成するようになっているため、Yodlをインストールしておかないとmakeでエラーになる[1]。 または、ドキュメントが不要な場合は、Makefileを編集して、Doc from SUBDIRS and from the for loop in the all target[1]

最後にmake、一応make checkをした後、make install。

make
make check
make install

インストールされたzshのバージョン確認:

$ zsh --version
zsh 5.0.6 (x86_64-unknown-linux-gnu)

パッケージの作成:

su -
mkdir /dev/shm/zsh-5.0.6
make install DESTDIR=/dev/shm/zsh-5.0.6/
cd /dev/shm/zsh-5.0.6/
makepkg ~/pkg/zsh-5.0.6.txz

/etc/shells

/etc/shellsに/bin/zshが入っていることを確認する。

/bin/bash
/bin/tcsh
/bin/csh
/bin/ash
/bin/ksh
/bin/zsh

/bin/shを置き換え

/bin/shのシンボリックリンクをzshに変えると、/bin/shがbashでないとうまく動かないスクリプトがあるのでリスクがある。

もし置き換える場合は、次のようにする[2]

$ cd /bin
$ sudo ln -sf zsh /bin/sh
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 3 10月  3 17:09 /bin/sh -> zsh*

ログインシェルをzshにする

chsh -s /bin/zsh

もしくは、/etc/passwdのログインシェルのエントリを編集する。

zshの設定

~/.zshrcを編集してzshを自分の好みにカスタマイズできる。

いきなりゼロから書くのは面倒であるが、かと言って設定なし状態で使うのも使いにくい。

zshを初回起動したときに起動するzsh-newuser-install:

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.

(2)  Populate your ~/.zshrc with the configuration recommended
     by the system administrator and exit (you will need to edit
     the file by hand, if so desired).

--- Type one of the keys in parentheses --- 

を利用して多少は設定できるが、個人的にはなんとなく物足りない。

そこで、ネット上で公開されている.zshrcを利用させてもらうと捗る。

例えば、私の場合は少し凝った zshrcを使わせてもらった。

zshのカスタマイズ性はかなり高いようなので[3]、こだわればきりがなさそうだ。

問題

typeコマンド

typeコマンドはビルトインコマンドだが、bashとzshでは挙動が異なる[4]

これが引き起こす具体的な問題として、xmltoというシェルスクリプトではshebangが#!/bin/shで、type -tを使っている箇所があるが、zshのtypeコマンドには-tオプションがないので/bin/shをzshにしているとxmltoがうまく動かないということがある。

他にもビルトインコマンドの違いが引き起こす問題があるかもしれない。

References