不使用root权限安装zsh和oh-my-zsh

问题

今天刚申请了一个服务器账号,登上去发现没有zsh。

因为没有root权限,也就无法使用apt-get命令了。

解决思路如下:

  1. 编译、安装zsh到家目录 (make 时可能找不到 autoconf
  2. 把安装好的zsh所在的目录添加到 PATH 环境变量中
  3. 登录后自动切换到 zsh
  4. 安装oh-my-zsh (不需要root)

下面是详细过程和遇到的问题及解决方法

安装zsh

官方文档:http://zsh.sourceforge.net/FAQ/zshfaq01.html

下载源码:

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

解压:(注意,下载下来的文件是xz格式的)

1
2
3
xz -d zsh.tar.xz # 会把xz文件解压成tar文件
mkdir zsh # 建立目录用来保存zsh源码
tar -xvf zsh.tar -C zsh --strip-components 1 # 解压tar文件到zsh目录

编译:

1
2
3
./configure --prefix=$HOME #表示安装到家目录
make
make install

如果遇到找不到 autoconf 的错误,则需要手动安装。

编译、安装autoconf到家目录:

1
2
3
4
5
6
7
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 文件。

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

这样操作之后就可以在命令行使用 zsh 了,但是不会默认使用 zsh 作为交互程序。

两条思路:

  1. 使用chsh (可以尝试,但是我失败了,因为没有权限写入 /etc/shells
  2. 修改启动脚本,自动切换到 zsh (官方推荐的方式)

我还是选择写入 ~/.bash_profile文件:

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

安装oh-my-zsh

一行代码搞定:

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

值得注意的是上述脚本的一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
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。这对我来说没什么影响。

坚持原创文章分享,您的支持将鼓励我继续创作!