Setup: 1.shell
现在在笔记系列的第1层,目的是渐渐完善命令行下使用linux的体验。
本文我们聚焦以下两点:
- 日常的Shell使用体验
- 在登录和打开交互式Shell时应该通过Shell脚本做哪些事情
Shell的选择
我使用过很长一段时间fish,因为它开箱即用,足够用户友好。但现在我更注重泛用性问题,打算回归使用bash,因为:
- bash是大部分发行版的默认shell
- 大部分linux的脚本是sh或bash脚本,而bash又是sh的增强版本,能正常运行大部分sh脚本。
- 通过一些工具能让bash在日常使用时达到接近fish的用户友好程度。
ChatGPT列举了以下工具(我们接下来会参考GPT的提示增强bash的功能)
- Bash Completion 是一个常用的插件,为 Bash 提供更智能的命令补全。
- bash-git-prompt 可以在 Bash 提示符中显示 Git 仓库的信息,使提示符更具信息性和美观。
- fzf 是一个命令行模糊查找器,能极大地增强 Bash 的文件和命令补全功能。
- powerline-shell 能美化 Bash 提示符,提供类似 Fish 的视觉效果。
- z - jump around 是一个目录跳转工具,可以根据使用频率快速跳转到常用目录。
Shell启动脚本
标题链接的博客文章充分说明了bash在不同情况下运行启动脚本的复杂性。我们参考作者的建议进行配置:
- 不使用
/etc/
下的配置。例如/etc/profile
,该文件在任何用户启动时都会运行,但我想让所有用户的共同启动行为保持默认。 ~/.bashrc
除了个别情况,只会在interactive shell模式下运行。所以我们用一行命令排除non-interactive的情况,然后加载环境变量和交互环境的必须环境
# ~/.bashrc
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
# env & interactive
if [ -f ~/.bash/env.sh ]; then
. ~/.bash/env.sh
fi
if [ -f ~/.bash/interactive.sh ]; then
. ~/.bash/interactive.sh
fi
~/.bash_profile
只在该用户登录后运行。它和~/.bash_profile
共用加载环境变量的脚本,但有单独的开机启动项脚本。注意,桌面应用的启动项会通过sway的配置启动,而不是在这里。
# ~/.bash_profile
# env & login
if [ -f ~/.bash/env.sh ]; then
. ~/.bash/env.sh
fi
if [ -f ~/.bash/login.sh ]; then
. ~/.bash/login.sh
fi
~/.bash_logout
以gpt的说法和我的实际经验来看,只会在login shell退出时执行
# logout
if [ -f ~/.bash/logout.sh ]; then
. ~/.bash/logout.sh
fi
环境变量
类似这样即可
# ~/.bash/env.sh
# editor
export EDITOR=nvim
# fcitx5
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export SDL_IM_MODULE=fcitx
# path: texlive
export PATH="/usr/local/texlive/2023/bin/x86_64-linux:$PATH"
改善交互体验
- 通过pacman安装
bash-completion
- 通过yay从AUR中安装
bash-git-prompt
。记得在~/.gitconfig
里加上:
[color "status"]
branch = magenta
untracked = cyan
unmerged = yellow
最后,配置~/.bash/interactive.sh
以启用前面所有插件
# interactive environment
alias ls='ls --color=auto'
alias grep='grep --color=auto'
PS1='[\u@\h \W]\$ '
# Use bash-completion, if available
[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \
. /usr/share/bash-completion/bash_completion
# Use bash-git-prompt(AUR), if available
if [[ -f /usr/lib/bash-git-prompt/gitprompt.sh ]]; then
# To only show the git prompt in or under a repository directory
GIT_PROMPT_ONLY_IN_REPO=1
# To use upstream's default theme
#GIT_PROMPT_THEME=Default
# To use upstream's default theme, modified by arch maintainer
GIT_PROMPT_THEME=Default_Arch
source /usr/lib/bash-git-prompt/gitprompt.sh
fi
# Use fzf, if available
if [[ -f /usr/share/fzf/completion.bash ]]; then
. /usr/share/fzf/completion.bash
fi
if [[ -f /usr/share/fzf/key-bindings.bash ]]; then
. /usr/share/fzf/key-bindings.bash
fi
# Use powerline, if available
if [[ -f /usr/share/powerline/bindings/bash/powerline.sh ]]; then
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /usr/share/powerline/bindings/bash/powerline.sh
fi
# Use z (https://github.com/rupa/z), if available
if [[ -f ~/all/proj/sw/bash_tools/z/z.sh ]]; then
. ~/all/proj/sw/bash_tools/z/z.sh
fi
# Use poshd (https://github.com/ponyofshadows/poshd), if available
if [[ -f ~/all/proj/sw/bash_tools/poshd/po.sh ]]; then
. ~/all/proj/sw/bash_tools/poshd/po.sh
fi
登录后要做的事情
# ~/.bash/login.sh
if [ -z "${WAYLAND_DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then
export XDG_CURRENT_DESKTOP=sway
exec sway --unsupported-gpu
fi