1. 程式人生 > >不使用root許可權安裝zsh和oh-my-zsh

不使用root許可權安裝zsh和oh-my-zsh

問題

今天剛申請了一個伺服器賬號,登上去發現沒有zsh。

因為沒有root許可權,也就無法使用apt-get命令了。

解決思路如下:

  1. 編譯、安裝zsh到家目錄 (make 時可能找不到 autoconf
  2. 把安裝好的zsh所在的目錄新增到 PATH 環境變數中
  3. 登入後自動切換到 zsh
  4. 安裝oh-my-zsh (不需要root)

下面是詳細過程和遇到的問題及解決方法

安裝zsh

下載原始碼:

wget -O zsh.tar.xz https://sourceforge.net/projects/zsh/files/latest/download

解壓:(注意,下載下來的檔案是xz格式的)

xz -d zsh.tar.xz # 會把xz檔案解壓成tar檔案
mkdir zsh # 建立目錄用來儲存zsh原始碼 tar -xvf zsh.tar -C zsh --strip-components 1 # 解壓tar檔案到zsh目錄

編譯:

./configure --prefix=$HOME  #表示安裝到家目錄
make
make install

如果遇到找不到 autoconf 的錯誤,則需要手動安裝。

編譯、安裝autoconf到家目錄:

wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
mkdir autoconf-soruce
tar -zxvf autoconf-latest.tar.gz -C autoconf-soruce/ --strip-components 1
cd
autoconf-soruce/ ./configure --prefix=$HOME # 安裝到家目錄 make make install

更新PATH

這樣以來 zsh 安裝到 $HOME/bin 下面,並且會自動新增環境變數,但是重新登陸後就找不到了。

所以記得手動更新 PATH ,我是選擇寫入 ~/.bash_profile 檔案。

echo 'export PATH="$HOME/bin:$HOME/.local/bin:$PATH"' >> ~/.bash_profile

這樣操作之後就可以在命令列使用 zsh 了,但是不會預設使用 zsh 作為互動程式。

兩條思路:

  1. 使用chsh (可以嘗試,但是我失敗了,因為沒有許可權寫入 /etc/shells
  2. 修改啟動指令碼,自動切換到 zsh (官方推薦的方式)

我還是選擇寫入 ~/.bash_profile檔案:

echo '[ -f $HOME/bin/zsh ] && exec $HOME/bin/zsh -l' >> ~/.bash_profile

安裝oh-my-zsh

一行程式碼搞定:

wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

值得注意的是上述指令碼的一段程式碼:

TEST_CURRENT_SHELL=$(expr "$SHELL" : '.*/\(.*\)')
if [ "$TEST_CURRENT_SHELL" != "zsh" ]; then
    # If this platform provides a "chsh" command (not Cygwin), do it, man!
    if hash chsh >/dev/null 2>&1; then
        printf "${BLUE}Time to change your default shell to zsh!${NORMAL}\n"
        chsh -s $(grep /zsh$ /etc/shells | tail -1)
    # Else, suggest the user do so manually.
    else
        printf "I can't change your shell automatically because this system does not have chsh.\n"
        printf "${BLUE}Please manually change your default shell to zsh!${NORMAL}\n"
    fi
fi

幹了啥?如果系統預設shell不是zsh的話,會嘗試使用 chsh 命令切換到 /etc/shells 列表裡的 zsh,如果切換失敗就會提示錯誤。

有什麼影響?如果全域性已經有zsh的情況下,這個指令碼會主動把預設shell切換成全域性的zsh,而不會使用本地的zsh。這對我來說沒什麼影響。