2018-05-30 課堂筆記

目錄

  1. 命令歷史
  2. 命令補全
  3. 命令別名
  4. 通配符
  5. 輸入輸出重定向
  6. 管道符
  7. 作業(yè)控制
  8. Shell 變量
  9. 環(huán)境變量配置文件

1. 命令歷史(history

Linux 可以記錄每個用戶所使用的命令, 并記錄到 ~/.bash_history 文件中
當(dāng)用戶以 bash 登入 Linux 主機后, 系統(tǒng)會主動地由 ~/.bash_history 讀取命令歷史
當(dāng)用戶注銷時, 會將最近的 HISTFILESIZE 個記錄寫入 ~/.bash_history 文件中

1.1 相關(guān)文件及變量

  • 文件: ~/.bash_history
  • 變量: HISTFILE=/home/<user>/.bash_history or /root/.bash_history # 指定 history 文件
  • 變量: HISTFILESIZE=1000 # history 文件最大的命令記錄條數(shù)
  • 變量: HISTSIZE=1000 # 當(dāng)前環(huán)境最大的命令記錄條數(shù)

1.2 history 命令用法

  • history #: 列出最近的 # 條命令
[root@localhost ~]# history 5
 1033  myname='Choco Lee'
 1034  echo $myname
 1035  init0
 1036  init 0
 1037  history 5
  • history -c: 清除當(dāng)前內(nèi)存內(nèi)的全部命令記憶
[root@localhost ~]# history 5
 1029  myname='Choco Lee'
 1030  echo $myname
 1031  init0
 1032  init 0
 1033  history 5
[root@localhost ~]# history -c ; history
[root@localhost ~]# history
   35  history                 # 不是清空了嗎? 怎么新的命令是從35開始計數(shù)?
  • history -r: 將 history 文件中的命令記憶讀出到當(dāng)前內(nèi)存中 #一般登錄時會自動進(jìn)行
  • history -w: 將目前的內(nèi)存中的命令記憶寫入 history 文件中 # 一般登出時會自動進(jìn)行

1.3 命令歷史相關(guān)的使用技巧

  • !<#> 執(zhí)行 history 命令顯示的 第 # 條命令
[root@localhost ~]# history 10
  998  echo $myname
  999  init0
 1000  init 0
 1001  env
 1002  set
 1003  history 3
 1004  history 10
 1005  echo $myname
 1006  myname='Choco Lee'
 1007  history 10
[root@localhost ~]# !998           # 執(zhí)行了第998條命令, 即 echo $myname
echo $myname
Choco Lee
  • !! 執(zhí)行上一條命令
[root@localhost ~]# !998
echo $myname
Choco Lee
[root@localhost ~]# !!        # 上面的命令又執(zhí)行了一遍
echo $myname
Choco Lee
  • !<keywords> 執(zhí)行最近的一條以< keywords> 開頭的命令
[root@localhost ~]# history 5
 1014  history 5
 1015  ls /etc/
 1016  ls /
 1017  echo $myname
 1018  history 5
[root@localhost ~]# !ls         # 執(zhí)行了最近的一條以 ls 開頭的命令, 即 ls /
ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp          usr
boot  etc  lib   media  opt  root  sbin  sys  tmp.tar.bz2  var

2. 命令補全(『Tab』)

非常提高工作效率的東西
這東西沒法上代碼,自己嘗試吧,誰用誰知道。

按一下:能進(jìn)行 『命令』 以及 『文件名』 的補全
按兩下:能夠羅列出所有符合補全的可能選項


3. 命令別名(alias、unalias

命令太長?常用命令的選項太多?有些命令后果嚴(yán)重,想在執(zhí)行前進(jìn)行提醒?
—— 用命令別名啊

3.1 查看當(dāng)前已經(jīng)存在的命令別名

alias

[root@localhost ~]# alias
alias cp='cp -I'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -I'
alias rm='rm -I'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

3.2 設(shè)置命令別名

alias xx=xxx -x x -x x

[root@localhost ~]# alias lm='ll -a | more'
[root@localhost ~]# alias | grep lm
alias lm='ll -a | more'

3.3 命令別名的相關(guān)文件

如果在 bash 中設(shè)置命令別名,則重啟后別名失效
其實只要是用戶登錄后所有會調(diào)用的環(huán)境配置文檔中寫入自定義命令別名的設(shè)置語句,都能實現(xiàn) 命令別名的固定

看一下 ~/.bashrc # 下列是 root 用戶的 ~./bashrc 文件, 為安全起見已進(jìn)行了部分別名設(shè)置, 但普通用戶一般不會有這樣的別名設(shè)置

[root@localhost ~]# cat .bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -I'
alias cp='cp -I'
alias mv='mv -I'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

3.4 取消命令別名

unalias <別名>

[root@localhost ~]# alias
alias cp='cp -I'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias lm='ll -a | more'            # 當(dāng)前 alias 中存在 lm
alias ls='ls --color=auto'
alias mv='mv -I'
alias rm='rm -I'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'


[root@localhost ~]# unalias lm ; alias         # 取消 lm 的別名后,發(fā)現(xiàn)別名中已沒有 lm
alias cp='cp -I'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -I'
alias rm='rm -I'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

4. 通配符與特殊符號

  • 通配符
符號 意義
* 代表0-無窮個 任意字符
? 代表有且只有一個字符
[ ] 代表有且僅有一個字符,且為[...]中所枚舉的其中一個, 如 [13579]
[-] 同上,只不過是一個范圍,如[ 0-9 ],[a-z]等
[^] 有且僅有一個,且不是所枚舉的任何字符,如:[^a-zA-Z] 代表該位不是字母
  • 特殊符號
符號 內(nèi)容
# 批注號
/ 轉(zhuǎn)義符號,將特殊字符或通配符還原成一般字符
| 管道符
; 命令銜接符,連續(xù)執(zhí)行兩條命令
~ 當(dāng)前用戶家目錄
$ 取用變量符號
& 工作控制,將指令變成后臺工作
! 邏輯非
>、>> 數(shù)據(jù)流重定向,output
<、<< 數(shù)據(jù)流重定向,input
' ' 單引號,無法引用變量
" " 雙引號,可以引用變量
` ` 指令引用,功能同 $(command)

5. 輸入輸出重定向

先看看正常情況下,執(zhí)行命令時,數(shù)據(jù)流的走向

數(shù)據(jù)流走向

5.1 standard output & standard error output

標(biāo)準(zhǔn)輸出,即命令成功執(zhí)行時,將執(zhí)行結(jié)果輸出至文件 or 設(shè)備
符號:> (覆蓋導(dǎo)出) 或 >> (追加導(dǎo)出)

5.1.1 標(biāo)準(zhǔn)輸出(覆蓋): >

如果多次命令的結(jié)果導(dǎo)出至同一個文件, 并采用覆蓋方式,那該文件將僅保留最后一次輸出的結(jié)果

[root@choco-01 ~]# cat /etc/motd 


        /\              /\         |
       /  \            /  \        |
      /    \          /    \       |
                                   |
                               

               -----               .


[root@choco-01 ~]# cat /etc/motd > aaa   #屏幕上不再顯示笑臉,原本該輸出至屏幕的內(nèi)容,現(xiàn)在輸出至 aaa 文件了
[root@choco-01 ~]# cat aaa


        /\              /\         |
       /  \            /  \        |
      /    \          /    \       |
                                   |
                               

               -----               .

既然是覆蓋導(dǎo)出,我們再導(dǎo)出一個數(shù)據(jù)流到 aaa 文件,然后看看 aaa 文件變成啥樣了

[root@choco-01 ~]# ls / > aaa
[root@choco-01 ~]# cat aaa           # 原本的內(nèi)容不見了
777
bin
boot
dev
disk-test
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
test
tmp
usr
var
YUM

5.1.2 標(biāo)準(zhǔn)輸出(追加): >>

如果多次命令結(jié)果導(dǎo)出至同一個文件,若采用追加方式,那每次命令的結(jié)果都會追加至該文件的末尾

[root@choco-01 ~]# echo "asdfasdf" >> aaa
[root@choco-01 ~]# cat aaa
777
bin
boot
dev
disk-test
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
test
tmp
usr
var
YUM
aaa
anaconda-ks.cfg
col.man
expect-test
passwd
passwd.linux
tee.txt
asdfasdf           # 看,最后一次導(dǎo)出的結(jié)果,被追加至該文件的末尾了

5.1.3 標(biāo)準(zhǔn)錯誤輸出(覆蓋): 2>

[root@choco-01 ~]# ls asdfasdf 2> bbb
[root@choco-01 ~]# cat bbb
ls: 無法訪問asdfasdf: 沒有那個文件或目錄
[root@choco-01 ~]# ls haha 2> bbb
[root@choco-01 ~]# cat bbb
ls: 無法訪問haha: 沒有那個文件或目錄

5.1.4 標(biāo)準(zhǔn)錯誤輸出(追加): 2>>

[root@choco-01 ~]# cat bbb
ls: 無法訪問haha: 沒有那個文件或目錄
[root@choco-01 ~]# ls 1234567 2>> bbb
[root@choco-01 ~]# cat bbb
ls: 無法訪問haha: 沒有那個文件或目錄
ls: 無法訪問1234567: 沒有那個文件或目錄

5.1.5 同時進(jìn)行標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯誤輸出

如果同時想將正常輸出與錯誤輸出都導(dǎo)入到同一個文件,且按照順序,使用 2>&1&>

<command> ><file> 2>&1 如: ls a b > report.txt 2>&1

[root@choco-01 ~]# ls
aaa  anaconda-ks.cfg  bbb  expect-test
[root@choco-01 ~]# ls aaa asdfasdf > aaa        
ls: 無法訪問asdfasdf: 沒有那個文件或目錄    # 屏幕上顯示了標(biāo)準(zhǔn)錯誤輸出的信息
[root@choco-01 ~]# cat aaa
aaa                                                # 文件中僅能看到標(biāo)準(zhǔn)輸出的信息
[root@choco-01 ~]# ls aaa asdfasdf 2> bbb
aaa                # 屏幕上顯示了標(biāo)準(zhǔn)輸出的信息
[root@choco-01 ~]# cat bbb
ls: 無法訪問asdfasdf: 沒有那個文件或目錄                    # 文件中僅能看到標(biāo)準(zhǔn)錯誤輸出的信息
[root@choco-01 ~]# ls aaa asdfasdf > aaa 2>&1
[root@choco-01 ~]# cat aaa                                            # 這樣就都能看到了
ls: 無法訪問asdfasdf: 沒有那個文件或目錄
aaa

5.2 standard input

原本需要由鍵盤輸入的數(shù)據(jù),改由文件內(nèi)容來取代

5.2.1 標(biāo)準(zhǔn)輸入(以 Ctrl + d 結(jié)束)

[root@choco-01 ~]# cat > aaa
123
456
[Ctrl + d]
[root@choco-01 ~]# cat aaa
123
456


[root@choco-01 ~]# cat aaa 
123
456
[root@choco-01 ~]# cat > aaa < .bashrc     #  .bashrc 的內(nèi)容替換了屏幕輸入,并被放到 aaa 文件中
[root@choco-01 ~]# cat aaa
# .bashrc

# User specific aliases and functions

alias rm='rm -I'
alias cp='cp -I'
alias mv='mv -I'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

5.2.2 標(biāo)準(zhǔn)輸入(以 指定字符 結(jié)束)

[root@choco-01 ~]# cat > bbb << "fuckoff"
> 123123
> 456456
> fuckoff
[root@choco-01 ~]# 

5.3 巧用垃圾桶

Linux 下有一個特殊的設(shè)備 /dev/null ,所有被寫入該設(shè)備的東西都會消失,所以如果有部分信息不想輸出至文件,也不想輸出至屏幕,那就輸出至 /dev/null 吧


6. 管道符

管道的概念與數(shù)據(jù)流重定向不同,管道只是在輸出至屏幕前多加一道工序,而配合管道的這些工序,往往是字符處理軟件

例子:
ls /etc/ | more # 原本要直接輸出至屏幕的信息, 用 more 進(jìn)行了加工

ls /etc/ | grep "bash" # 原本直接輸出至屏幕的信息, 用 grep "bash" 進(jìn)行了加工, 篩選出了關(guān)鍵字


7. 作業(yè)控制

當(dāng)你希望同時執(zhí)行多項耗時較長的任務(wù)時, 雖然 tty 有多個, 但是來回切換也是很麻煩的
這時可以用到 linux 下的 "工作管理"

7.1 基本概念

  • foreground: 前臺, 平常執(zhí)行命令的界面
  • background: 后臺, 看不到的地方
  • 什么樣的工作適合放到后臺: 不需要與用戶交互的命令
  • 放入后臺的工作是無法用 Ctrl + c 來終止的
  • 后臺的工作有兩種狀態(tài): 暫停(stop) 和 運行中( running)

7.2 直接將命令放到后臺運行(&)

直接在待執(zhí)行的命令的最后加上空格和 &

[root@localhost tmp]# vim aaa &
[1] 2561

加上&后, 命令直接被甩到后臺進(jìn)行執(zhí)行, 在執(zhí)行完成后會在前臺彈出提示
但是, 如果執(zhí)行的命令帶有 stdout 或 stderr 時(如 tar -v), 則大量信息仍然會扔到前臺來, 所以此時最好用上數(shù)據(jù)流重定向(推薦 2>&1

7.3 將正在運行的命令扔到后臺,且置為暫停(ctrl+z)

[root@localhost tmp]# vim bbb
                                                  # 此時按下 ctrl+z, 將正在執(zhí)行的 vim 扔到后臺且置為暫停
[1]-  已停止               vim aaa

[2]+  已停止               vim bbb
[root@localhost tmp]# vim ccc
                                                  # 扔后臺
[3]+  已停止               vim ccc

任何正在執(zhí)行的任務(wù), 在按下 ctrl+z 后, 都會被扔到后臺, 且置為"暫停"狀態(tài)
代碼中看到每暫停一個工作, 提示信息里就顯示一個數(shù)字和一個加號, 數(shù)字表示改任務(wù)目前在后臺的編號, 而加號則代表該任務(wù)是最新的一個被扔后臺的任務(wù)

7.4 查看后臺中的任務(wù)(jobs)

[root@localhost tmp]# jobs
[1]   已停止               vim aaa
[2]-  已停止               vim bbb
[3]+  已停止               vim ccc

加號: 最新被扔進(jìn)來的
減號: 次新被扔進(jìn)來的
更早被扔進(jìn)來的就不帶符號了

jobs 的選項:

  • -l:同時列出任務(wù)的 PID
  • -r: 僅列出后臺中處于 "running" 的任務(wù)
  • -s: 僅列出后臺中處于 "stop" 的任務(wù)
[root@localhost tmp]# jobs -l
[1]   2561 停止 (tty 輸出)     vim aaa
[2]-  2562 停止                  vim bbb
[3]+  2563 停止                  vim ccc

7.5 將后臺工作拿回到前臺來(fg)

fg <job_num>

fg #不加任務(wù)號則將帶加號的拿回來

[root@localhost tmp]# jobs -l
[1]   2561 停止 (tty 輸出)     vim aaa
[2]-  2562 停止                  vim bbb
[3]+  2563 停止                  vim ccc


[root@localhost tmp]# fg 1              # 拿回 1 號任務(wù)
vim aaa
                                        # 再扔回去
[1]+  已停止               vim aaa
[root@localhost tmp]# jobs
[1]+  已停止               vim aaa
[2]   已停止               vim bbb
[3]-  已停止               vim ccc

再次扔回后臺的命令將帶有加號, 因為 加號/減號 分別代表 最新/次新, 是個相對的概念, 所以在前后臺切換的過程中會不斷變化
但是 任務(wù)號 不會發(fā)生變化

7.6 將后臺暫停的任務(wù)激活

bg <job_num>

bg #不加任務(wù)號則將在后臺激活帶加號的任務(wù)

[root@localhost tmp]# tar -zcf root.tar.gz /                    # 立即按 ctrl+z, 扔到后臺
tar: Removing leading `/' from member names
^Z
[4]+  已停止               tar -zcf root.tar.gz /
[root@localhost tmp]# jobs
[4]+  已停止               tar -zcf root.tar.gz /                # 當(dāng)前處于后臺暫停狀態(tài)


[root@localhost tmp]# bg 4;jobs                                 # 用 bg 命令在后臺激活該任務(wù)
[4]+ tar -zcf root.tar.gz / &
[4]+  運行中               tar -zcf root.tar.gz / &              # 看, 在運行了

7.7 kill 命令(簡)

如果想要直接移除后臺的任務(wù)怎么做?
---用 kill

7.7.1 kill 的用法
kill -<signal> %<job_num>

kill -<signal> <PID>

7.7.2 常用 signal

  • -1: 重新讀取參數(shù)的配置文件(類似 reload)
  • -9: 立即強制刪除一個任務(wù)
  • -15: 已正常方式結(jié)束一個任務(wù)

**7.7.3 例子

[root@localhost tmp]# jobs
[4]+  已停止               tar -zcf root.tar.gz /
[root@localhost tmp]# kill -9 %4 ; jobs                       # kill 掉4號任務(wù)
[4]+  已停止               tar -zcf root.tar.gz /
[root@localhost tmp]# jobs                                    # 有一定延時才能殺死
[4]+  已殺死               tar -zcf root.tar.gz /
[root@localhost tmp]# jobs                                    # 殺干凈后沒有任務(wù)了
[root@localhost tmp]#

ps-1.: kill 默認(rèn)是以 PID 來進(jìn)行進(jìn)程殺死的, 若要殺死某個任務(wù)號, 則任務(wù)號前必須加 %
ps-1.: -9是暴力殺死, -15是溫柔殺死, 兩者的區(qū)別在殺死 vim 時較為明顯: 若用 -9 殺死, 則會留有 .filename.swp 文件, 下次再進(jìn)行 vim 時會有修復(fù)提示; 而若用 -15 殺死, 則能較好地料理后事, 不會有這種緩存文件存在.


8. Shell 變量

8.1 變量的種類

  • 環(huán)境變量
    往往以純大寫來命名, bash 的子進(jìn)程中仍可使用

  • 自定義變量
    推薦使用純小寫來命名, 不經(jīng)過聲明, 則在 bash 的子進(jìn)程中無法使用

8.2 變量的命名

由字母、數(shù)字、下劃線組成,且只能以非數(shù)字開頭

8.3 變量的設(shè)定

語法:變量名=變量值
注意-1:如果變量值中存在空格,需要用單引號或雙引號將變量值括起來
注意-2:如果變量值中有引用其他變量,需要用雙引號將變量值括起來

例一:

[root@choco-01 ~]# myname=Choco
[root@choco-01 ~]# echo $myname
Choco
[root@choco-01 ~]# myname=Choco Lee
-bash: Lee: 未找到命令
[root@choco-01 ~]# echo $myname
Choco
[root@choco-01 ~]# myname='Choco Lee'
[root@choco-01 ~]# echo $myname
Choco Lee

例二:

[root@choco-01 ~]# myadd=China
[root@choco-01 ~]# full='$myname @ $myadd'
[root@choco-01 ~]# echo $full
$myname @ $myadd                      #單引號不具有引用變量的能力
[root@choco-01 ~]# full="$myname @ $myadd"
[root@choco-01 ~]# echo $full
Choco Lee @ China
[root@choco-01 ~]# 

8.4 變量的相關(guān)命令

8.4.1echo
功能:打印變量的內(nèi)容

[root@choco-01 ~]# echo $LANG
zh_CN.UTF-8

8.4.2 export
功能:將變量轉(zhuǎn)換為環(huán)境變量

[root@choco-01 ~]# echo $full
Choco Lee @ China
[root@choco-01 ~]# bash
[root@choco-01 ~]# echo $full          # 進(jìn)入子 shell 后, 變量失效

[root@choco-01 ~]# exit
exit

[root@choco-01 ~]# export full          # 聲明該變量為環(huán)境變量
[root@choco-01 ~]# bash
[root@choco-01 ~]# echo $full           # 進(jìn)入子 shell 后, 變量仍讓有效 
Choco Lee @ China

8.4.3 env
功能:查看環(huán)境變量

8.4.4 declare
用法:
declare [-aixr] <var_name>
選項:

  • -a:定義變量為數(shù)組
  • -i:定義變量為純數(shù)字
  • -x:定義變量為環(huán)境變量
  • -r:定義變量為 readonly

8.5 常用環(huán)境變量

  • HOME: 當(dāng)前用戶的家目錄
  • HOSTNAME: 該主機的主機名
  • USER: 當(dāng)前用戶的用戶名
  • SHELL: 當(dāng)前使用的 shell 類型
  • HISTSIZE: 可存儲的歷史命令條數(shù)
  • MAIL: 當(dāng)前用戶的郵箱
  • PATH: 可執(zhí)行命令的所在目錄
  • LANG: 當(dāng)前語系
  • PS1: 命令提示符的格式, 可玩性較高, 但工作中不常用, 可自行 man bash 查看 PS1 的設(shè)置方法
  • PS2: 輸入命令時強制換行后的提示符
  • OSTYPE: 當(dāng)前操作系統(tǒng)類型
  • MACHTYPE: 安裝的機器類型
  • HOSTTYPE: 主機的位數(shù), x86 還是 x86_64

9. 環(huán)境變量配置文件

9.1 login 與 non-login

  • login shell:取得 bash 時需要完整的登錄流程。如由 tty1-tty6登錄時,需要輸入用戶的賬號和密碼
    讀取的文件:
    • /etc/profile :系統(tǒng)整體的設(shè)定,對所有用戶皆生效
    • ~/.bash_profile~/.bash_login~/.profile:用戶的個人設(shè)定
      但是各個文件中可能又會調(diào)用其他的文件,所以一般來說,login shell 讀取的文件如下圖所示:
  • non-login shell:取得 bash 接口的方法不需要重復(fù)登錄的舉動,如在 bash 環(huán)境下,再次執(zhí)行bash命令進(jìn)入子 shell 時,不需要輸入賬號和密碼

9.2 /etc/profile (login shell)

該文件會根據(jù)用戶的 UID 設(shè)定好許多環(huán)境變量以及參數(shù)

9.2.1 設(shè)定環(huán)境變量

  • PATH:根據(jù) UID 決定PATH 變量是否要包含 sbin 目錄
  • USER:根據(jù) id 命令的結(jié)果,顯示用戶名
  • LOGNAME:等于 USER
  • MAIL:配置好用戶的郵箱
  • HOSTNAME:根據(jù) hostname 指令,決定該變量值
  • HISTSIZE:直接設(shè)定歷史命令記錄的條數(shù)為 1000

9.2.2 調(diào)用 /etc/profile.d/*.sh

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$I"
        else
            . "$i" >/dev/null
        fi
    fi
done

/etc/profile.d/ 下的腳本,主要是進(jìn)行 bash 顏色、語系、vi 的別名、which 的別名等設(shè)置

9.3 ~/.bash_profile (login shell)

根據(jù)之前流程圖的描述,bash shell 讀取完通用配置后,才開始進(jìn)行用戶個性化配置的讀取。
其實用戶個性化配置的文件不止 ~/.bash_profile 一個,還可能有 ~/.bahs_login 和 ~/.profile
為什么有這么多個性化配置文件呢?主要是為了給從其他種類的 shell 轉(zhuǎn)來使用 bash 的用戶提供便利,滿足其習(xí)慣罷了。
所以我們往往只能見到 ~/.bash_profile 而已

9.3.1 三種文件的讀取順序及規(guī)律

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

其實 bash 的 login shell 只會讀取上述文件中的其中一個, 讀取順序依照上面的排序, 一旦讀取到其中一個文件, 就不再繼續(xù)讀取其余文件

9.3.2 ~/.bash_profile 內(nèi)容

[root@localhost ~]# cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

~/.bash_profile 調(diào)取了 ~/.bashrc 文件, 并將 ~/bin 目錄加入到 PATH 變量中

9.4 ~/.bashrc (non-login shell)

當(dāng)通過 non-login shell 取得 bash 后, 僅會讀取 ~/.bashrc 文件

先來看看 ~/.bashrc 的內(nèi)容吧

[root@localhost ~]# cat .bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -I'
alias cp='cp -I'
alias mv='mv -I'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

定義了幾個別名, 然后又調(diào)用了 /etc/bashrc
/etc/bashrc 會完成以下任務(wù)

  • 根據(jù)不同的 UID 設(shè)置 umask 值
  • 根據(jù)不同的 UID 設(shè)置 PS1 變量
  • 調(diào)用 /etc/profile.d/*.sh

ps. 如果家目錄下沒有 .bashrc 文件, 那么你的 bash 提示符可能會變成如下樣子

-bash-4.2#

但是沒關(guān)系, 還記得 /etc 下有個模板目錄嗎? 就是 /etc/shel/. 把該目錄下的 .bashrc 文件復(fù)制到家目錄即可.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容