FreeBSD 全局配置 zsh + oh-my-zsh

Posted by sysin on 2021-06-11
Estimated Reading Time 8 Minutes
Words 1.9k In Total
Viewed Times

请访问原文链接:FreeBSD 全局配置 zsh + oh-my-zsh,查看最新版。原创作品,转载请保留出处。

作者:gc(at)sysin.org,主页:www.sysin.org

OMZLogo

FreeBSD 使用 tcsh(1) 作为自己的默认 Shell。zsh 作为终极 Shell,在 FreeBSD 下也是适用的。使用 oh-my-zsh 配置 zsh 默认仅对当前用户有效,新建或者切换用户后,仍然恢复到了默认的 shell,重新配置新用户略嫌繁琐。本文描述全局配置的方法,新用户将默认使用 zsh 并加载统一的配置文件。

本文内容基于 FreeBSD 13.0

准备 zsh

  • 查看当前 shell
1
echo $SHELL

返回结果:

1
/bin/csh

注意:以下全局配置相关命令需要 root 权限,请切换到 root 账号,或者使用 sudo(需手动安装配置)。

  • 安装 zsh
1
pkg install zsh

提示消息

1
2
3
4
5
6
7
8
9
10
11
12
13
Message from zsh-5.8:

--
==========================================================

By default, zsh looks for system-wide defaults in
/usr/local/etc.

If you previously set up /etc/zprofile, /etc/zshenv, etc.,
either move them to /usr/local/etc or rebuild zsh with the
ETCDIR option enabled.

==========================================================

注意:在 FreeBSD 中非系统自带 shell 安装路径如下:

1
2
 % type zsh
zsh is /usr/local/bin/zsh
  • 设置默认 shell

根据 FreeBSD 安全建议,不要为 root 用户切换为非系统内置 shell,因为 FreeBSD 中 非内置 shell 安装路径为 /usr/local/bin/(不同于 Linux 安装在 /bin/),意外情况下可能导致文件系统无法挂载,root 用户无法访问自己的 shell。但是可以将 toor 账号配置使用 zsh 作为默认 shell。

为非 root 用户切换默认 shell:

1
2
chsh -s /usr/local/bin/zsh <username>
# <username> 替换为实际用户名

退出重新登录生效。

  • 安装 git

执行:

1
pkg install git

全局配置 zsh

  • 使用 GNU sed 替代 BSD sed

以下 sed 命令部分请用 gsed 替代,或者使用 alias。

1
2
3
pkg install gsed #FreeBSD
gsed --v #安装后命令都是 gsed
alias sed=gsed #可用别名替代 BSD sed
  • 切换成 root
1
2
3
4
su #切换到 root 账号,pwd 不变
su - #切换到 root 账号,pwd 同时变为 root 主目录
sudo -i #同上
alias sed=gsed #用 GNU sed 替代 BSD sed
  • 全局安装 zsh 到 /etc 目录
1
git clone https://github.com/robbyrussell/oh-my-zsh.git /etc/oh-my-zsh
  • 从模板文件复制 .zshrc 创建默认配置文件(新用户将使用该配置文件)
1
2
3
cp /etc/oh-my-zsh/templates/zshrc.zsh-template /usr/share/skel/dot.zshrc /usr/share/skel/dot.zshrc

/usr/share/skel/dot.zshrc

FreeBSD 用户默认配置文件目录是 /usr/share/skel/,Linux 默认为 /etc/skel/

1
2
3
4
5
6
7
8
9
10
11
# ls -ahlFT
total 45
drwxr-xr-x 2 root wheel 9B Apr 9 14:22:15 2021 ./
drwxr-xr-x 31 root wheel 31B Apr 9 14:09:38 2021 ../
-rw-r--r-- 1 root wheel 962B Apr 9 14:22:15 2021 dot.cshrc
-rw-r--r-- 1 root wheel 323B Apr 9 14:22:15 2021 dot.login
-rw-r--r-- 1 root wheel 91B Apr 9 14:22:15 2021 dot.login_conf
-rw------- 1 root wheel 301B Apr 9 14:22:15 2021 dot.mail_aliases
-rw-r--r-- 1 root wheel 267B Apr 9 14:22:15 2021 dot.mailrc
-rw-r--r-- 1 root wheel 978B Apr 9 14:22:15 2021 dot.profile
-rw-r--r-- 1 root wheel 695B Apr 9 14:22:15 2021 dot.shrc
  • 修改 on-my-zsh 的安装目录 export ZSH=$HOME/.oh-my-zshexport ZSH=/etc/oh-my-zsh
1
sed -i 's|$HOME/.oh-my-zsh|/etc/oh-my-zsh|g' /usr/share/skel/dot.zshrc
  • 更改默认主题(推荐 ys)

编辑 /usr/share/skel/dot.zshrc 文件修改:

1
sed -i '/^ZSH_THEME=*/c ZSH_THEME="ys"' /usr/share/skel/dot.zshrc
  • 取消每周自动检查更新

取消注释 ~/.zshrc 中的 “# DISABLE_AUTO_UPDATE=”true””

1
2
3
4
5
6
7
sed -i 's/^#[ ]\(DISABLE_AUTO_UPDATE="true"\)/\1/' /usr/share/skel/dot.zshrc
# -i 写入文件
# "" Unix sed 备份机制,直接引号表示不备份
# s 替换指定字符
# ^ 匹配行开始
# [ ] 中括号中间有空格表示要替换的内容是一个空格,注意被替换的内容是空格用 " "(双引号中间有空格)表示。
# \1 的意思就类似于前面的 (DISABLE_AUTO_UPDATE="true"\),\1 就是复制这个位置的内容,

手动更新:omz update(旧版命令:upgrade_oh_my_zsh)

  • 新增用户单独配置 zsh cache 目录
1
echo "export ZSH_CACHE_DIR=~/.oh-my-zsh/cache" >> /usr/share/skel/dot.zshrc
  • 创建新用户配置文件上述变量定义的缓存目录
1
mkdir -p /usr/share/skel/.oh-my-zsh/cache
  • 配置 ll 别名(可选)
1
2
echo 'alias ll="ls -lahFT"' >> /usr/share/skel/dot.zshrc
echo 'alias sed=gsed' >> /usr/share/skel/dot.zshrc

全局配置插件

全局安装插件(安装到 /etc/oh-my-zsh/custom/plugins/)

zsh-autosuggestions:作用是根据历史输入命令的记录即时的提示,然后按键盘 → 即可补全。

(个人不推荐这个插件。oh-my-zsh 默认安装也自带强大的命令补全功能。)

1
git clone https://github.com/zsh-users/zsh-autosuggestions.git /etc/oh-my-zsh/custom/plugins/zsh-autosuggestions

编辑 /usr/share/skel/dot.zshrc,找到 plugins=(git) 这一行,修改为:

plugins=(git zsh-autosuggestions)

zsh-syntax-highlighting:语法高亮插件。

作用:命令错误会显示红色,直到你输入正确才会变绿色,另外路径正确会显示下划线。

安装:

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git /etc/oh-my-zsh/custom/plugins/zsh-syntax-highlighting

配置启用插件:
编辑 /usr/share/skel/dot.zshrc
以下部分加入插件的名字
plugins=([plugins…] zsh-syntax-highlighting)

快速修改:

1
sed -i '/^plugins=*/c plugins=(git zsh-syntax-highlighting)' /usr/share/skel/dot.zshrc

增强的实时自动命令补全插件:Incremental completion on zsh

(该插件对性能似乎有一点点影响,请根据需要启用。)

作用如图:

incr

1
2
3
4
mkdir /etc/oh-my-zsh/custom/plugins/incr
curl -fsSL https://mimosa-pudica.net/src/incr-0.2.zsh -o /etc/oh-my-zsh/custom/plugins/incr/incr.zsh
#启用该功能
echo "source /etc/oh-my-zsh/custom/plugins/incr/incr.zsh" >> /usr/share/skel/dot.zshrc

使用用户配置文件

  • 改变新建用户的默认 shell 行为(可选)

FreeBSD 中可以修改 adduser 命令默认 shell

vi /usr/sbin/adduser

将 “DEFAULTSHELL=/bin/sh” 修改为 “DEFAULTSHELL=/usr/local/bin/zsh”

以下是 Linux 中的方法,备忘。

vi /etc/default/useradd

将 SHELL= * (比如 SHELL=/bin/sh) 改成 SHELL=/bin/zsh

修改后,使用 useradd 命令无需 -s /bin/zsh,用户默认使用 zsh,当然也可以不修改此项,useradd 命令继续追加 -s /bin/zsh 参数。

新用户登录后,将自动复制 .zshrc 和上述 cache 目录到用户主目录下,并自动加载 zsh 配置。

  • 针对现有用户

直接复制 /usr/share/skel/dot.zshrc 到 ~/

1
2
3
cp /usr/share/skel/dot.zshrc ~/.zshrc
mkdir -p ~/.oh-my-zsh/cache
source ~/.zshrc
  • 新建一个用户并指定 zsh 为默认 Shell

FreeBSD 安装 sudo 后,并且配置 wheel 组获得 sudo 权限,新建一个管理员账号并使用 zsh 作为默认 shell:

1
2
pw useradd -n <username> -G wheel -s /usr/local/bin/zsh -m && passwd <username>
# <username> 替换为实际用户名

以下是 Linux 中的配置,备忘:

在 visudo (/etc/sudoers)默认配置下,创建管理员账号的命令如下:

CentOS:

1
2
useradd -m -s /bin/zsh -G wheel user1  #user1 为用户名
passwd user1 #为 user1 设置密码

Ubuntu:

1
2
useradd -m -s /bin/zsh -G sudo user1  #user1 为用户名
passwd user1 #为 user1 设置密码

备注:

-m 创建同名 home 目录

-s 指定 shell

-G 修改附加属组


捐助本站 ❤️ Donate


如果文章中使用的内容或图片侵犯了您的版权,请联系作者删除。如果您喜欢这篇文章或者觉得它对您有所帮助,欢迎您发表评论,也欢迎您分享这个网站,或者赞赏一下作者,谢谢!


支付宝打赏 微信打赏

赞赏一下



1000000