重新認識 Bash 設定檔 Ubuntu 20.04

bash Shell
時至今日,一直以來習慣的Ubuntu 設定環境,已經有許多的改變,一些從前使用的工具,也逐漸被新工具取代,而沒有預先安裝了。比如更常用到 systemctl 這個整合指令,取代以前雜散設定、啟用指令;timedatectl 來啟用、停用 NTP 服務,暫時更改系統時間;ip 取代了常用的網路設定指令 ifconfig;ss 取代 netstat 查看網路服務狀態等等;ufw 取代 iptables 防火牆設定。

其他像 bash (Bourne Again SHell) ,雖然目前20.04版還是維持不變繼續使用它,但其初始化設定檔案的規劃,已經跟早期 Ubuntu 的規劃不太一樣,有必要重新檢視安排。由於我習慣將 /home 目錄,獨立一顆硬碟使用,以便在更新作業系統的時候,只要執行設定檔、資料庫的備份,便能放心將系統磁碟整個 format 掉,重灌新作業系統,以確保新版作業系統的純淨與相容性,因此,我的使用者目錄裡的 bash 設定檔案還是舊的安排方式,最近想連同其他習慣一起改掉,順便做個紀錄。

目前在 Ubuntu 20.04,若是您創建一個新的使用者,該使用者的初始目錄下,會存在三個檔案,分別是 .profile .bashrc .bash_logout。當你登入系統的時候,最先被執行的是 .profile,然後 .profile 裡面有指令會去執行 .bashrc。當你登出系統時,則會去執行 .bash_logout 這個設定檔案。

以下是 Ubuntu 20.04 給新使用者的預設bash檔案。

.profile 設定檔

Ubuntu 系統登入程序,會先去讀取、執行 /etc/profile 裡面的 script,然後再到使用者目錄,讀取執行這個 ~/.profile,算是 /etc/profile 的延續。因此,這個設定檔並不是給 bash 專用,如果使用者目錄中,有.bash_profile或者.bash_login的話,這個檔案就不會被 bash 讀取。
不過,要是你將使用者的預設shell 改成 zsh 或 tcsh,系統登入過程,還是會過來執行 ~/profile 裡面的 script。
下面便是 .profile 在 Ubuntu 20.04 預設的內容:

# ~/.profile: executed by the command interpreter for login shells.

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login

# exists.

# see /usr/share/doc/bash/examples/startup-files for examples.

# the files are located in the bash-doc package.


# the default umask is set in /etc/profile; for setting the umask

# for ssh logins, install and configure the libpam-umask package.

#umask 022


# if running bash

if [ -n "$BASH_VERSION" ]; then

    # include .bashrc if it exists

    if [ -f "$HOME/.bashrc" ]; then

        . "$HOME/.bashrc"

    fi

fi


# set PATH so it includes user's private bin if it exists

if [ -d "$HOME/bin" ] ; then

    PATH="$HOME/bin:$PATH"

fi


# set PATH so it includes user's private bin if it exists

if [ -d "$HOME/.local/bin" ] ; then

    PATH="$HOME/.local/bin:$PATH"

fi

第一段有個被標註起來 umask,可以讓你自行決定建立新檔時,預設的權限為何。umask 是二進位權限的的補數,像一個二進位篩子。以 022 為例,用7去減每一個位數,就得到補數 755 (等同於二進位 111 101 101,也就是從 000 010 010 這個022數值而來),所以預設的檔案 ugo 權限就會是 rwx r-x r-x ,自己有全部權限,群組跟其他使用者,可以讀取、執行,但不能更改。
要自己決定預設檔案權限,把前面那個 # 去除即可。
第二段檢查是否存在 $BASH_VERSION 這個系統變數,如果變數存有版本號,則去執行使用者目錄中的 .bashrc 這個檔。
後面兩個段落,純粹就是加入 ~/bin 跟 ~/.local/bin 這兩個目錄到 $PATH 變數。
這個.profile 檔案,大部分都不要動,頂多在檔案最後加以下這行,讓你執行當前目錄的程式時,不需要多打 ./xxxx:
# add path of current location
PATH=".:$PATH"
.bashrc 會去執行 ~/.bash_alias 這個檔案,你可以把自己想用的命令別名(濃縮的指令)放在這個檔裡面,會比較容易管理。.bashrc 預設有給你幾個好用、關於 ls 的命令別名設定:
alias ls='ls --color=auto'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

.bashrc 設定檔

這個檔案,被 .profile 指定執行,但前提是該使用者預設的 shell 是 bash。以下就是 .bashrc 的內容:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

.bash_logout 設定檔

這個檔案就是 bash 自己會去讀取執行的,在使用者登出系統之後、關機之前:

# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi


沒有留言:

張貼留言