配置Bash Shell和系統配置文件

Bash Shell的配置與變量

  • Linux(UNIX)用戶可根據需要重新配置系統

  • 最常用重新配置Bash Shell的方法如下:

    1. 利用局域變量來設定Bash Shell
    2. 通過別名和函數來設定Bash Shell
    3. 通過set命令來設定Bash Shell
    4. 通過環境變量設定Bash Shell中其他命令和應用程序
  • shell變量是內存中一個命了名的臨時存儲區

  • 在其中可以存放數字或字符等信息

  • shell變量的特性如下:

    • shell變量分爲兩種類型、即局部變量和環境變量
    • 局部變量只能在當前的工作環境(shell)中使用
    • 環境變量即可在當前shell中使用、也會傳給它的所有子shell
  • 顯示shell變量名和值使用如下兩個命令:

    1. 使用set命令顯示所有的變量
    2. 使用env命令只顯示環境變量
[dag@dog ~]$ set | more
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete
:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-
linux-gnu")
BASH_VERSION='4.1.2(2)-release'
COLORS=/etc/DIR_COLORS
COLORTERM=gnome-terminal
COLUMNS=80
CVS_RSH=ssh
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-OlCMoNPXFc,guid=805ef93b5edcbb1
2e77e291400000046
DESKTOP_SESSION=gnome
DIRSTACK=()
DISPLAY=:0.0
EUID=500
GDMSESSION=gnome
GDM_KEYBOARD_LAYOUT=us
GDM_LANG=zh_CN.UTF-8
GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/gnome-terminal.desktop
GIO_LAUNCHED_DESKTOP_FILE_PID=3292
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_KEYRING_PID=2855
--More--
[5]+  Stopped                 set | more
[dag@dog ~]$ env | more
ORBIT_SOCKETDIR=/tmp/orbit-dag
HOSTNAME=dog.super.com
GIO_LAUNCHED_DESKTOP_FILE_PID=3292
IMSETTINGS_INTEGRATE_DESKTOP=yes
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
XDG_SESSION_COOKIE=9300d649ab64d01fa9a5376500000008-1590027640.651057-1776179669
GTK_RC_FILES=/etc/gtk/gtkrc:/home/dag/.gtkrc-1.2-gnome2
WINDOWID=41943043
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
IMSETTINGS_MODULE=IBus
USER=dag
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd
=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;4
2:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:
*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:
*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31
:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01
;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bm
p=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:
*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=
--More--
[6]+  Stopped                 env | more

通過局部變量設定Shell

  • 通過創建shell變量或修改變量值設定shell
  • Linux中通常習慣用大寫字母作爲shell變量名
  • 創建shell局部變量的方法:變量名=變量的值
    • DOG1_COLOR=black、DOG1_COLOR爲shell變量名、black爲變量的值
  • 要提取shell變量中的值在變量之前冠以$符號:
    • Echo $DOG1_COLOR
  • 用以下組合命令列出所有DOG開始的shell變量
    • set | grep DOG
[dag@dog ~]$ DOG1_COLOR=black
[dag@dog ~]$ set | more
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete
:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-
linux-gnu")
BASH_VERSION='4.1.2(2)-release'
COLORS=/etc/DIR_COLORS
COLORTERM=gnome-terminal
COLUMNS=80
CVS_RSH=ssh
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-OlCMoNPXFc,guid=805ef93b5edcbb1
2e77e291400000046
DESKTOP_SESSION=gnome
DIRSTACK=()
DISPLAY=:0.0
DOG1_COLOR=black
EUID=500
--More--
Most commands optionally preceded by integer argument k.  Defaults in brackets.
Star (*) indicates argument becomes new default.
-------------------------------------------------------------------------------
<space>                 Display next k lines of text [current screen size]
z                       Display next k lines of text [current screen size]*
<return>                Display next k lines of text [1]*
d or ctrl-D             Scroll k lines [current scroll size, initially 11]*
q or Q or <interrupt>   Exit from more
s                       Skip forward k lines of text [1]
f                       Skip forward k screenfuls of text [1]
b or ctrl-B             Skip backwards k screenfuls of text [1]
'                       Go to place where previous search started
=                       Display current line number
/<regular expression>   Search for kth occurrence of regular expression [1]
n                       Search for kth occurrence of last r.e [1]
!<cmd> or :!<cmd>       Execute <cmd> in a subshell
v                       Start up /usr/bin/vi at current line
ctrl-L                  Redraw screen
:n                      Go to kth next file [1]
:p                      Go to kth previous file [1]
:f                      Display current file name and line number
.                       Repeat previous command
-------------------------------------------------------------------------------
沒有前一個常規表達式
[7]+  Stopped                 set | more
[dag@dog ~]$ echo $DOG1_COLOR
black
[dag@dog ~]$ DOG2_COLOR=grey
[dag@dog ~]$ set | grep DOG
DOG1_COLOR=black
DOG2_COLOR=grey
[dag@dog ~]$ set | grep LINES
LINES=24
[dag@dog ~]$ set | grep PS1
PS1='[\u@\h \W]\$ '
[dag@dog ~]$ env | grep PS1

局部變量PS1

  • PS1變量主要設置Bash 提示符所顯示的信息
  • 可將一些換碼序列插入到PS1變量中、它們成爲提示信息的一部分、常用換碼序列如下:
  • \d:系統當前的日期、d應該是date的第1個字母
  • \t:系統當前的時間、t應該是time的第1個字母
  • \h:簡短形式的主機名、h應該是host(主機)的第1個字母
  • \u:當前用戶名、u應該是user的第1個字母
  • \w:當前的工作目錄、w應是working directory的第1個字母
  • !:當前命令的歷史編號、!爲執行歷史命令的第1個字符
  • $:如果是普通用戶顯示$、而如果是root用戶顯示#
  • \l:顯示shell終端設備的基本名、l應該是line的第1個字母
[dag@dog ~]$ echo $PS1
[\u@\h \W]\$
[dag@dog ~]$ set | grep PS1
PS1='[\u@\h \W]\$ '
[dag@dog ~]$ PS1='[\u@\h \W]\$ '
[dag@dog ~]$ PS1='[\u@\h \w TTY\1 \d \t \!]\$'
[dag@dog ~ TTY\1 四 5月 21 01:14:36 273]$echo $DOG1_COLOR
black
[dag@dog ~ TTY\1 四 5月 21 01:16:13 274]$
[dag@dog ~ TTY\1 四 5月 21 01:16:19 274]$

別名的用法及設定

  • 使用alias命令爲history命令創建別名h
  • 使用alias命令爲rm -i創建一個名爲del的別名
  • 使用不帶任何參數的alias命令列出所有的別名
  • 取消別名命令爲:unalias 別名的名字
    alias h=history
    alias del=‘rm -i’
    [dog@dog wolf]$ alias
    alias del=‘rm -i’
    alias dir=‘ls -laF’
    alias h=‘history’
    ……
[dag@dog ~]$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

[dag@dog ~]$ alias dir='ls -laF'

[dag@dog ~]$ alias dir
alias dir='ls -laF'
[dag@dog ~]$ dir
總用量 25088
drwx------. 37 dag  dag     4096 5月  21 05:26 ./
drwxr-xr-x.  6 root root    4096 5月  17 23:12 ../
drwxrwxr-x.  2 dag  dag     4096 3月  29 23:52 .abrt/
drwxrwxr-x.  2 dag  dag     4096 5月  20 00:15 arch/
-rw-rw-r--.  1 dag  dag        0 5月  20 00:13 arch.gz
-rw-rw-r--.  1 dag  dag  6174720 5月  20 00:04 arch.tar
-rw-rw-r--.  1 dag  dag  6104748 5月  20 00:17 arch.tar.bz2
-rw-rw-r--.  1 dag  dag  6107364 5月  20 00:16 arch.tar.gz
drwxrwxr-x.  2 dag  dag     4096 5月  19 23:25 babydog/
drwxrwxr-x.  2 dag  dag     4096 5月  21 05:26 backup/
-rw-------.  1 dag  dag     3203 5月  21 05:26 .bash_history
-rw-r--r--.  1 dag  dag       18 10月 15 2014 .bash_logout
-rw-r--r--.  1 dag  dag      176 10月 15 2014 .bash_profile
-rw-r--r--.  1 dag  dag      124 10月 15 2014 .bashrc
drwxrwxr-x.  2 dag  dag     4096 5月  13 23:53 boydog/
drwxr-xr-x.  6 dag  dag     4096 5月  20 22:22 .cache/
-rw-rw-r--.  1 dag  dag     1208 5月  13 23:24 cal2038
-rw-rw-r--.  1 dag  dag     2128 5月  13 23:29 cal3009
drwx------.  2 dag  dag     4096 5月  17 23:51 .comments/
drwxr-xr-x.  7 dag  dag     4096 3月  29 23:52 .config/
drwx------.  3 dag  dag     4096 3月  29 23:52 .dbus/
-rw-r--r--.  1 dag  dag       32 5月  20 22:20 .dmrc
-rw-r--r--.  1 root root 4724150 3月  15 2018 dog.JPG
-rw-r--r--.  1 dag  dag      500 10月 10 2013 .emacs
-rw-r--r--.  1 root root   13015 5月  16 07:11 epel-release-6-8.noarch.rpm
-rw-------.  1 dag  dag       16 3月  29 23:52 .esd_auth
-rw-r--r--.  1 root root 1433498 3月  15 2018 flowers.JPG
drwxr-xr-x.  2 dag  dag     4096 5月  16 08:08 .fontconfig/
-rw-r--r--.  1 root root    1950 3月  15 2018 game.txt
drwx------.  4 dag  dag     4096 5月  20 22:20 .gconf/
drwx------.  2 dag  dag     4096 5月  16 23:08 .gconfd/
drwxr-xr-x. 10 dag  dag     4096 5月  16 23:08 .gnome2/
drwx------.  2 dag  dag     4096 3月  29 23:53 .gnome2_private/
drwxrwxr-x.  3 dag  dag     4096 3月  29 23:52 .gnote/
drwx------.  2 dag  dag     4096 5月  20 22:20 .gnupg/
drwxrwxr-x.  2 dag  dag     4096 3月  29 23:52 .gstreamer-0.10/
-rw-rw-r--.  1 dag  dag      180 5月  20 22:20 .gtk-bookmarks
drwx------.  2 dag  dag     4096 3月  29 23:52 .gvfs/
-rw-------.  1 dag  dag     3720 5月  20 22:20 .ICEauthority
-rw-r--r--.  1 dag  dag      789 5月  20 22:20 .imsettings.log
-rw-r--r--.  1 root root    4720 3月  15 2018 learning.txt
-rw-rw-r--.  1 dag  dag     1208 5月  13 23:28 lists
-rw-rw-r--.  1 dag  dag     1208 5月  14 03:34 lists200
drwxr-xr-x.  3 dag  dag     4096 3月  29 23:52 .local/
drwxr-xr-x.  6 dag  dag     4096 5月  20 22:22 .mozilla/
drwxrwxr-x.  2 dag  dag     4096 5月  16 23:37 mumdog/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 .nautilus/
-rw-rw-r--.  1 dag  dag       36 5月  16 10:29 news
-rw-r--r--.  1 root root  869219 3月  15 2018 NewZealand.JPG
drwxrw----.  3 dag  dag     4096 5月  21 00:21 .pki/
drwx------.  2 dag  dag     4096 3月  29 23:52 .pulse/
-rw-------.  1 dag  dag      256 3月  29 23:52 .pulse-cookie
drwx------.  2 dag  dag     4096 5月  13 05:04 .ssh/
drwx------.  3 dag  dag     4096 5月  13 04:21 .thumbnails/
-rw-------.  1 dag  dag     4344 5月  21 05:26 .viminfo
drwxrwxr-x.  2 dag  dag     4096 5月  19 23:40 wolf/
-rw-------.  1 dag  dag     4003 5月  21 05:26 .xsession-errors
-rw-------.  1 dag  dag     2145 5月  20 00:17 .xsession-errors.old
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 公共的/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 模板/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 視頻/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 圖片/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 文檔/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 下載/
drwxr-xr-x.  2 dag  dag     4096 3月  29 23:52 音樂/
drwxr-xr-x.  2 dag  dag     4096 5月  13 04:57 桌面/
[dag@dog ~]$ cd wolf
[dag@dog wolf]$ dir
總用量 8
drwxrwxr-x.  2 dag dag 4096 5月  19 23:40 ./
drwx------. 37 dag dag 4096 5月  21 05:26 ../
-rw-rw-r--.  1 dag dag    0 5月  16 22:45 dog1.wolf
-rw-rw-r--.  1 dag dag    0 5月  16 22:45 dog2.wolf
-rw-rw-r--.  1 dag dag    0 5月  16 22:45 dog3.wolf
-rw-rw-r--.  1 dag dag    0 5月  16 22:47 dog3.wolf.boy
-rw-rw-r--.  1 dag dag    0 5月  16 22:46 dog.wolf.boy
-rw-rw-r--.  1 dag dag    0 5月  16 22:46 dog.wolf.girl
[dag@dog wolf]$ h
bash: h: command not found
[dag@dog wolf]$ alias h=history
[dag@dog wolf]$ h
    1  su root
    2  chkconfig telnet --list
    3  su root
    4  su rooot
    5  su root
    6  whoami
    7  who am i
    8  ssh user@localhost
    9  who
   10  w
   11  users
   12  tty
  ......

[dag@dog wolf]$ alias del='rm-i'
[dag@dog wolf]$ del dog3.wolf.boy
bash: rm-i: command not found
[dag@dog wolf]$ alias del='rm -i'
[dag@dog wolf]$ del dog3.wolf.boy
rm:是否刪除普通空文件 "dog3.wolf.boy"?n
[dag@dog wolf]$ dir *.boy
-rw-rw-r--. 1 dag dag 0 5月  16 22:47 dog3.wolf.boy
-rw-rw-r--. 1 dag dag 0 5月  16 22:46 dog.wolf.boy
[dag@dog wolf]$ alias
alias del='rm -i'
alias dir='ls -laF'
alias h='history'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[dag@dog wolf]$ unalias dir
[dag@dog wolf]$ unalias h
[dag@dog wolf]$ unalias del
[dag@dog wolf]$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[dag@dog wolf]$ alias info='hostname;whoami;date'
[dag@dog wolf]$ info
dog.super.com
dag
2020年 05月 21日 星期四 06:13:10 EDT

利用set進行shell的設置

  • 許多shell參數可通過set -o命令來設定
  • 列出全部可通過set -o命令設置的參數及默認值
  • 使用set命令重新設置noclobber參數的值
  • 列出noclobber參數的當前值
    set -o | more
    set -o noclobber
    [dog@dog wolf]$ set -o | grep noclob
    noclobber on
[dag@dog wolf]$ cd -
/home/dag

[dag@dog ~]$ set -o | more
allexport          off
braceexpand        on
emacs              on
errexit            off
errtrace           off
functrace          off
hashall            on
histexpand         on
history            on
ignoreeof          off
interactive-comments    on
keyword            off
monitor            on
noclobber          off
noexec             off
noglob             off
nolog              off
notify             off
nounset            off
onecmd             off
physical           off
pipefail           off
posix              off
privileged         off
verbose            off
vi                 off
xtrace             off

[dag@dog ~]$ cd wolf

[dag@dog wolf]$ cp dog.wolf.baby.boy
cp: 在"dog.wolf.baby.boy" 後缺少了要操作的目標文件
請嘗試執行"cp --help"來獲取更多信息。
[dag@dog wolf]$ cp dog.wolf.baby boy
cp: 無法獲取"dog.wolf.baby" 的文件狀態(stat): 沒有那個文件或目錄
[dag@dog wolf]$ ls
dog1.wolf  dog2.wolf  dog3.wolf  dog3.wolf.boy  dog.wolf.boy  dog.wolf.girl
[dag@dog wolf]$ cat dog.wolf.boy
[dag@dog wolf]$ ls
dog1.wolf  dog2.wolf  dog3.wolf  dog3.wolf.boy  dog.wolf.boy  dog.wolf.girl
[dag@dog wolf]$ cd -
/home/dag
[dag@dog ~]$ ls
arch          backup                       flowers.JPG   news            圖片
arch.gz       boydog                       game.txt      NewZealand.JPG  文檔
arch.tar      cal2038                      learning.txt  wolf            下載
arch.tar.bz2  cal3009                      lists         公共的          音樂
arch.tar.gz   dog.JPG                      lists200      模板            桌面
babydog       epel-release-6-8.noarch.rpm  mumdog        視頻
[dag@dog ~]$ cd boydog
[dag@dog boydog]$ ls
cal2012  cal3009
[dag@dog boydog]$ cd -
/home/dag
[dag@dog ~]$ cd babydog
[dag@dog babydog]$ ls
baby      baby.kg   cal2038   dog_wolf.baby  lists
baby2     baby.sex  cal3009   letters        wolf.baby
baby.age  cal2012   dog.baby  letters.upper  wolf_dog.baby
[dag@dog babydog]$ cat baby
Age:3 months
Weight: 8kg
Gender:F
[dag@dog babydog]$ cp baby /home/dag/wolf/boy
[dag@dog babydog]$ cd -
/home/dag
[dag@dog ~]$ cd wolf
[dag@dog wolf]$ ls
boy        dog2.wolf  dog3.wolf.boy  dog.wolf.girl
dog1.wolf  dog3.wolf  dog.wolf.boy
[dag@dog wolf]$ boy
bash: boy: command not found
[dag@dog wolf]$ cat boy
Age:3 months
Weight: 8kg
Gender:F

[dag@dog wolf]$ cat boy
Age:3 months
Weight: 8kg
Gender:F

[dag@dog wolf]$ la -l >& boy

[dag@dog wolf]$ cat boy
bash: la: command not found

[dag@dog wolf]$ la -l boy
bash: la: command not found

[dag@dog wolf]$ cat boy
bash: la: command not found

[dag@dog wolf]$ cat /home/dag/babydog/baby /home/dag/wolf/boy
Age:3 months
Weight: 8kg
Gender:F
bash: la: command not found

[dag@dog wolf]$ cp  /home/dag/babydog/baby /home/dag/wolf/boy

[dag@dog wolf]$ cat boy
Age:3 months
Weight: 8kg
Gender:F

[dag@dog wolf]$ set -o noclobber

[dag@dog wolf]$ set -o
allexport          off
braceexpand        on
emacs              on
errexit            off
errtrace           off
functrace          off
hashall            on
histexpand         on
history            on
ignoreeof          off
interactive-comments    on
keyword            off
monitor            on
noclobber          on
noexec             off
noglob             off
nolog              off
notify             off
nounset            off
onecmd             off
physical           off
pipefail           off
posix              off
privileged         off
verbose            off
vi                 off
xtrace             off

[dag@dog wolf]$ set -o | grep noclob
noclobber          on

[dag@dog wolf]$ la -l >&boy
bash: boy: cannot overwrite existing file

[dag@dog wolf]$ la -l > boy
bash: boy: cannot overwrite existing file

[dag@dog wolf]$ cat boy
Age:3 months
Weight: 8kg
Gender:F

[dag@dog wolf]$ date >> boy

[dag@dog wolf]$ cat boy
Age:3 months
Weight: 8kg
Gender:F
2020年 05月 21日 星期四 22:19:43 EDT

[dag@dog wolf]$ set -o | egrep 'emacs|vi'
emacs              on
privileged         off
vi                 off

[dag@dog wolf]$ set -o vi

[dag@dog wolf]$ set -o | egrep 'emacs|vi'
emacs              off
privileged         off
vi                 on

[dag@dog wolf]$ set -o emacs

[dag@dog wolf]$ set -o | egrep 'emacs|vi'
emacs              on
privileged         off
vi                 off

將局部變量轉換成環境變量

  • 當用戶創建了一個變量之後,這個變量只能在該用戶目前工作的shell環境中使用
  • 一旦離開了當前的shell環境,該變量就失效
  • 只有環境變量才能不僅在當前的shell環境中生效、而且還可以在它的所有子shell中生效
  • 將自定義的變量升級成環境變量的命令:
    • export 變量名
    • 如export DOG1_COLOR
    • export DOG2_COLOR=grey

當一個變量不再需要時可用unset命令取消

  • unset DOG2_COLOR
  • 在子shell中, unset命令取消當前shell中的變量、而其他shell中的變量不受影響
  • 在主(parent) shell中, unset命令不但取消了當前shell中的變量、而且也取消它的所有子shell中的變量
[dag@dog ~]$ set | grep DOG

[dag@dog ~]$ DOG1_COLOR=black

[dag@dog ~]$ set | grep DOG
DOG1_COLOR=black

[dag@dog ~]$ su cat
密碼:

[cat@dog dag]$ set | grep DOG

[cat@dog dag]$ exit
exit

[dag@dog ~]$ export DOG1_COLOR

[dag@dog ~]$ env | grep DOG
DOG1_COLOR=black
[dag@dog ~]$ su cat
密碼:

[cat@dog dag]$ set | grep DOG
DOG1_COLOR=black

[cat@dog dag]$ env | grep DOG
DOG1_COLOR=black

[cat@dog dag]$ exit
exit

[dag@dog ~]$ export DOG2_COLOR=grey

[dag@dog ~]$ env | grep DOG2
DOG2_COLOR=grey

[dag@dog ~]$ su cat
密碼:

[cat@dog dag]$ env | grep DOG2
DOG2_COLOR=grey

[cat@dog dag]$ unset DOG2_COLOR

[cat@dog dag]$ env | grep DOG
DOG1_COLOR=black

[cat@dog dag]$ exit
exit

[dag@dog ~]$ env | grep DOG
DOG2_COLOR=grey
DOG1_COLOR=black

[dag@dog ~]$ unset DOG1_COLOR
[dag@dog ~]$ set | grep DOG
DOG2_COLOR=grey
_=DOG1_COLOR

[dag@dog ~]$ unset DOG1_COLOR

[dag@dog ~]$ env | grep DOG
DOG2_COLOR=grey

[dag@dog ~]$ su cat
密碼:

[cat@dog dag]$ env | grep DOG
DOG2_COLOR=grey

常用的環境變量

  • 在Linux系統中有許多預設的環境變量
  • 經常使用的環境變量及操作環境的命令如下:
    • HOME:用戶家目錄的路徑
    • PWD:用戶當前的工作目錄
    • LANG:標識程序將要使用的默認語言
    • TERM:用戶登錄終端的類型
    • reset:當屏幕崩潰,重新設置終端的命令(不是變量)
    • PATH:可執行文件(命令)搜索路徑
    • which:定位並顯示可執行文件所在路徑的命令(不是變量)
    • SHELL:用戶登錄shell的路徑。
    • USER:用戶的用戶名。
      DISPLAY:X顯示器的名字
[cat@dog dag]$ cd -
bash: cd: OLDPWD not set

[cat@dog dag]$ su dag
密碼:

[dag@dog ~]$ env | grep HOME
HOME=/home/dag

[dag@dog ~]$ su - root
密碼:

[root@dog ~]# env | grep HOME
HOME=/root

[root@dog ~]# echo $HOME
/root

[root@dog ~]# env | grep PWD
PWD=/root

[root@dog ~]# exit
logout

[root@dog ~]# exit
logout

[dag@dog ~]$ env | grep PWD
PWD=/home/dag

[dag@dog ~]$ cd wolf

[dag@dog wolf]$ env | grep PWD
PWD=/home/dag/wolf
OLDPWD=/home/dag

[dag@dog wolf]$ env | grep LANG
LANG=zh_CN.UTF-8
GDM_LANG=zh_CN.UTF-8

[dag@dog wolf]$ cd -
/home/dag

[dag@dog ~]$ env | grep LANG
LANG=zh_CN.UTF-8
GDM_LANG=zh_CN.UTF-8

[dag@dog ~]$ env | grep TERM
TERM=xterm
COLORTERM=gnome-terminal

[dag@dog ~]$ env | grep TERM
TERM=xterm
COLORTERM=gnome-terminal

[dag@dog ~]$ env | grep PATH
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dag/bin
WINDOWPATH=1

shell啓動腳本和登錄shell

  • Shell啓動腳本的作用包含以下4點:
    1. 通過在啓動腳本中設置局部變量或運行set命令來設置shell
    2. 通過在啓動腳本文件中建立環境變量設置其他程序
    3. 在啓動腳本文件中創建(啓用)別名
    4. 在啓動腳本文件中定義系統啓動時要執行的程序

login shell執行的啓動腳本和順序

  • 當一個用戶登錄Linux時,登錄shell按如下順序執行所需的腳本:
    1. 執行/etc/profile啓動腳本、在/etc/profile中會調用/etc/profile.d目錄下的所有啓動腳本
    2. 執行/.bash_profile啓動腳本、在/.bash_profile啓動腳本中又會調用/.bashrc啓動腳本、而/.bashrc啓動腳本又將調用/etc/bashrc啓動腳本
  • Linux爲每個用戶自動創建.bash_profile和.bashrc腳本文件,這兩個文件存放在用戶的家目錄中
[dag@dog ~]$ ls -l /etc/profile.d
總用量 72
-rw-r--r--. 1 root root 1150 5月   2 2018 colorls.csh
-rw-r--r--. 1 root root 1172 5月   2 2018 colorls.sh
-rw-r--r--. 1 root root   92 10月 10 2013 cvs.csh
-rw-r--r--. 1 root root   78 10月 10 2013 cvs.sh
-rw-r--r--. 1 root root  192 4月  30 2018 glib2.csh
-rw-r--r--. 1 root root  192 4月  30 2018 glib2.sh
-rw-r--r--. 1 root root   58 4月   9 2019 gnome-ssh-askpass.csh
-rw-r--r--. 1 root root   70 4月   9 2019 gnome-ssh-askpass.sh
-rw-r--r--. 1 root root 1745 5月  24 2019 lang.csh
-rw-r--r--. 1 root root 2706 5月  24 2019 lang.sh
-rw-r--r--. 1 root root  123 8月  16 2014 less.csh
-rw-r--r--. 1 root root  121 8月  16 2014 less.sh
-rw-r--r--. 1 root root  976 10月 12 2011 qt.csh
-rw-r--r--. 1 root root  912 10月 12 2011 qt.sh
-rw-r--r--. 1 root root 2142 1月  11 2017 udisks-bash-completion.sh
-rw-r--r--. 1 root root  105 7月  18 2019 vim.csh
-rw-r--r--. 1 root root  269 7月  18 2019 vim.sh
-rw-r--r--. 1 root root  169 10月 13 2011 which2.sh
[dag@dog ~]$ tail -8 /etc/profile
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done


unset i
unset -f pathmunge
[dag@dog ~]$ tail -12  /etc/profile
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done


unset i
unset -f pathmunge

[dag@dog ~]$ su - root
密碼:

[root@dog ~]# cp /etc/profile profile.bak

[root@dog ~]# ls
anaconda-ks.cfg  install.log.syslog  公共的  視頻  文檔  音樂
install.log      profile.bak         模板    圖片  下載  桌面

[root@dog ~]# vi /etc/profile
# /etc/profile
echo '1. /etc/profile is running !!!'
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc


[root@dog ~]# exit
logout

[dag@dog ~]$ vi .bash_profile
# .bash_profile
echo "2. ~/.bash profile is running !!!"
# Get the aliases and functions

[dag@dog ~]$ vi .bashrc
# .bashrc
echo "3. ~/.bashrc is running !!!"
# Source global definitions

[dag@dog ~]$ vi /etc/bashrc
[dag@dog ~]$ su - root
密碼:

[root@dog ~]# vi /etc/bashrc
# /etc/bashrc
# .bashrc
echo "4. /etc/bashrc is running !!!"
# Source global definitions

退出重新登錄dag用戶和cat用戶
[dag@dog ~]$ su - cat
密碼:
1. /etc/profile is running !!!
4. /etc/bashrc is running !!!

[cat@dog ~]$ su - dag
密碼:
1. /etc/profile is running !!!
2. ~/.bash profile is running !!!
3. ~/.bashrc is running !!!
4. /etc/bashrc is running !!!

Non-login shell 執行的啓動腳本和順序

  • Non-login shell不執行/etc/profile啓動腳本
  • 也不執行~/.bash_profile啓動腳本
  • 當用戶以Non-login shell登錄Linux系統時,
  • 將首先執行/.bashrc腳本文件、而/.bashrc腳本將調用/etc/bashrc腳本文件
  • 當執行完了這兩個啓動腳本文件之後,Non-login shell纔會執行/etc/profile.d目錄中全部相關的腳本文件
#顯示的結果非常清楚的標明Non-login shell 沒有執行etc/profile和~/.bash_profile啓動腳本
[cat@dog ~]$  su dag
密碼:
3. ~/.bashrc is running !!!
4. /etc/bashrc is running !!!

[dag@dog cat]$ pwd
/home/cat

[dag@dog cat]$ whoami
dag

#使用bash啓動一個新的shell
[dag@dog cat]$ bash
3. ~/.bashrc is running !!!
4. /etc/bashrc is running !!!

#使用sh命令發現shell將不會執行~/.bashrc和/etc/bashrc啓動腳本,執行完命令以後
系統的提示符變成了Bourn Shell的提示符sh-4.1$,爲後面的操作方便,使用exit退回原來的Bash Shell
[dag@dog cat]$ sh
sh-4.1$ exit
exit

/etc/profile文件 和/etc.prpfile.d目錄

  • Login shell啓動時確保執行啓動腳本/etc/profile

  • 在這個腳本文件中設置的一些重要變量爲:

    • PATH:預設可執行文件或命令的搜索路徑。
    • USER:用戶登錄時使用的用戶名。
    • LOGNAME:其值爲$USER。
    • HOSTNAME:所使用的主機名。
    • MAIL:存放用戶電子郵件的郵箱、一個ASCII碼文件
    • HISTSIZE:歷史記錄的行數。
    • INPUTRC變量:它指向/etc/inputrc文件、該文件是 一個 ASCII碼文件、其中存放的是針對鍵盤熱鍵設置的信息
  • 在/etc/profile.d目錄中存放的是一些應用程序所需的啓動腳本

  • 這些腳本包括顏色、語言、less、vim及which等命令的一些附加設置

  • 因爲在/etc/profile中使用for循環語句調用了這些腳本,所以這些腳本才能夠被自動執行

  • 這些腳本是用來設置一些變量和運行一些初始化過程的

[dag@dog ~]$ cat /etc/profile | grep USER
    USER="`/usr/bin/id -un`"
    LOGNAME=$USER
    MAIL="/var/spool/mail/$USER"
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL


[dag@dog ~]$ id
uid=500(dag) gid=500(dag) 組=500(dag),504(friends) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[dag@dog ~]$ id -u
500

[dag@dog ~]$ id -un
dag

[dag@dog ~]$ echo $USER
dag

[dag@dog ~]$ echo $LOGNAME
dag

[dag@dog ~]$ echo $MAIL
/var/spool/mail/dag

[dag@dog ~]$ file /var/spool/mail/dag
/var/spool/mail/dag: empty

[dag@dog ~]$ cat /var/spool/mail/dag

[dag@dog ~]$ cd /etc/profile.d

[dag@dog profile.d]$ ls
colorls.csh  glib2.sh               less.csh                   vim.csh
colorls.sh   gnome-ssh-askpass.csh  less.sh                    vim.sh
cvs.csh      gnome-ssh-askpass.sh   qt.csh                     which2.sh
cvs.sh       lang.csh               qt.sh
glib2.csh    lang.sh                udisks-bash-completion.sh

[dag@dog profile.d]$ file less.sh
less.sh: ASCII text

[dag@dog profile.d]$ cat less.sh
# less initialization script (sh)
[ -x /usr/bin/lesspipe.sh ] && export LESSOPEN="${LESSOPEN-||/usr/bin/lesspipe.sh %s}"

~/.bash_profile和~/.bashrc及其他一些系統文件

  • /.bash_profile和/.bashrc這兩個腳本文件中主要是存放用戶自己的一些設定、其中包括了用戶自己定義的變量和別名
  • 如登錄時需執行某些將把輸出信息傳送到屏幕上的指令,應該將這些指令放在/.bash_profile文件中,而不要放在/.bashrc文件中
  • /etc/bashrc腳本文件中的信息是全局性的,其中包括了一些全系統使用的函數和別名的設定,如umask的設定

其他:

  • 環境變量的設定並不放在~/.bash_profile文件中、而是放在/etc/profile文件中
  • ~/.bash_logout腳本文件也是存放在用戶的家目錄中、每當用戶退出系統時就會運行該腳本文件
  • ~/.bash_logout主要作用是用戶退出系統時自動運行某些程序,如自動備份一些重要並在用戶登錄後更改過的文件、及刪除沒用的臨時文件等
  • Linux系統支持多種語言、而這些有關語言信息的變量是由/etc/ sysconfig/i18n文件維護的
  • ~/.bash_history文件存放用戶使用過的命令、每個命令一行
  • 每當用戶登錄bash之後,bash就會立即將這個文件中的所有歷史命令讀入內存
  • 正因爲如此,一個用戶才能查看到他使用過的歷史命令
  • 使用如下的命令獲取歷史命令的總數:
    [dog@dog ~]$ history | wc -l
    999
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章