Pony of Shadows

Queen of Truth & King of Practice


Setup: 1.shell

现在在笔记系列的第1层,目的是渐渐完善命令行下使用linux的体验。

本文我们聚焦以下两点:

  • 日常的Shell使用体验
  • 在登录和打开交互式Shell时应该通过Shell脚本做哪些事情

Shell的选择

我使用过很长一段时间fish,因为它开箱即用,足够用户友好。但现在我更注重泛用性问题,打算回归使用bash,因为:

  • bash是大部分发行版的默认shell
  • 大部分linux的脚本是sh或bash脚本,而bash又是sh的增强版本,能正常运行大部分sh脚本。
  • 通过一些工具能让bash在日常使用时达到接近fish的用户友好程度。

    ChatGPT列举了以下工具(我们接下来会参考GPT的提示增强bash的功能)

    1. Bash Completion 是一个常用的插件,为 Bash 提供更智能的命令补全。
    2. bash-git-prompt 可以在 Bash 提示符中显示 Git 仓库的信息,使提示符更具信息性和美观。
    3. fzf 是一个命令行模糊查找器,能极大地增强 Bash 的文件和命令补全功能。
    4. powerline-shell 能美化 Bash 提示符,提供类似 Fish 的视觉效果。
    5. z - jump around 是一个目录跳转工具,可以根据使用频率快速跳转到常用目录。

Shell启动脚本

标题链接的博客文章充分说明了bash在不同情况下运行启动脚本的复杂性。我们参考作者的建议进行配置:

  1. 不使用/etc/下的配置。例如/etc/profile,该文件在任何用户启动时都会运行,但我想让所有用户的共同启动行为保持默认。
  2. ~/.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
  1. ~/.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
  1. ~/.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
  • 通过pacman安装fzf, 使用方法见链接
  • 通过pacman安装powerlinepowerline-fonts
  • 通过git安装z
  • 通过git安装poshd

最后,配置~/.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