1. 程式人生 > >02.Linux系統Bash初識

02.Linux系統Bash初識

bash初識

1.Linux系統終端概述

服務器終端切換: Ctrl + Alt + F1 … F6
虛擬機終端切換: Ctrl +Shift +Alt +F1 … F6
虛擬終端由mingetty程序生成

//物理機執行為本地終端
[root@linux ~]# tty
/dev/tty1

//通過網絡使用模擬終端遠程連接Linux, 日常運維中就是這種方式。
[root@linux ~]# tty
/dev/pts/1

2.Linux系統Bash管理

技術分享圖片

簡單的說, Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令並把它送入內核去執行。

技術分享圖片

實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令並且把它們送到內核。

Linux也提供了像MicrosoftWindows那樣的可視的命令輸入界面X Window的圖形用戶界面它提供了很多桌面環境系統,其操作就像Windows一樣,有窗口、圖標和菜單,所有的管理都是通過鼠標控制。GNOME。

Linux, Shell也有多種不同的版本。主要有下列版本的Shell:

BASH Shell: 是一個為GNU計劃編寫的Unix shell, 是許多Linux發行版的默認Shell
C Shell: 是SUN公司Shell的BSD版本。
Z Shell: 它集成了bash、ksh的重要特性,同時又增加了自己獨有的特性。

還有許多傳統UNIX上用的Shell,例如tcsh、csh、ash、bsh、ksh等, Shell Script大致都類同,當您學會一種Shell以後,其它的Shell很快就上手, 大多數的時候, 一個Shell腳本 通常可以在很多種Shell上使用。

2.1.Bash特性:命令補全

通過上下方向鍵來調取過往執行過的Linux命令;
命令或參數僅需輸入前幾位就可以用Tab鍵補全;

tab鍵可以實現命令補全, 路徑補全和命令實現方式一致, 工作中我們經常用到tab補全, 減少執行命令以及路徑出錯率。

//查看ip時忘記具體了命令
[root@nfs1 ~]# ifcon
//按下tab鍵會自動補全
[root@nfs1 ~]# ifconfig

//按一下tab鍵沒有反應, 按兩下tab鍵列出所有if開頭的命令
[root@nfs1 ~]# if
if         ifconfig   ifenslave  ifrename
ifcfg      ifdown     ifnames    ifup

//linux路徑較深, 經常使用tab鍵進行補全, 如果路徑出錯是沒有辦法補全
[root@nfs1 ~]# ls /etc/sysconfig/network-scripts/

2.2.Bash特性:命令快捷鍵

終端快捷鍵的使用可以幫助我們大大提升效率

Ctrl + A    //光標跳轉至正在輸入的命令行的首部
Ctrl + E    //光標跳轉至正在輸入的命令行的尾部
Ctrl + C    //終止前臺運行的程序
Ctrl + D    //在shell中,ctrl-d表示推出當前shell。
Ctrl + Z    //將任務暫停,掛至後臺
Ctrl + L    //清屏,和clear命令等效。
Ctrl + K    //刪除從光標到行末的所有字符
Ctrl + U    //刪除從光標到行首的所有字符
Ctrl + R    //搜索歷史命令, 利用關鍵字

//在命令行前加面加 "#" 則該命令不會被執行

History查看系統命令歷史, 追溯之前發生情況

命令選項
-w 保存命令歷史到歷史文件
-c 清空命令歷史記錄, 不會情況文件
-d 刪除命令歷史的第 N 條行

//使用雙 !! 可執行上一條命令
[root@localhost ~]# ls
localhost.com
[root@localhost ~]# !!
ls
localhost.com

//輸入!6, 執行history命令歷史中第 6 行命令
[root@localhost ~]# !6
touch localhost.com

//使用!cat, 調用history命令歷史最近一次執行過的cat命令
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# !cat
cat /etc/sysconfig/network-scripts/ifcfg-eth0

執行當前命令, 調用上一條命令最後一個參數
[root@localhost ~]# ls /etc/passwd

//調用上一條命令的最後一行, 按下ESC松開, 然後按下 "."
[root@localhost ~]# cat
[root@localhost ~]# cat /etc/passwd
//第二種方式, 輸入!$
[root@localhost ~]# ls !$
ls /etc/passwd
/etc/passwd

2.3.Bash特性:命令流程

當我們執行一個命令, 整個命令執行流程如下:
1.判斷命令是否通過絕對路徑執行
2.判斷命令是否存在別名
3.判斷用戶輸入的是內部命令還是外部命令
4.內部命令直接執行, 外部命令檢測是否存在緩存
5.檢測PATH路徑, 有執行, 無報錯

內部命令: shell程序自帶的命令。
外部命令: 在系統PATH變量的某個路徑下的可執行程序。

//1.定義臨時別名, if1為查看eth0網卡別名
[root@localhost ~]# alias if0=‘ifconfig eth0‘
[root@localhost ~]# if0

//如果定義命令本身, 會執行什麽?
[root@localhost ~]# alias ifconfig=‘ifconfig eth0‘
    //絕對路徑執行, 調用命令本身
    [root@localhost ~]# /sbin/ifconfig
    //通過\轉義字符, 調用命令本身
    [root@WebServer ~]# \ifconfig

//2.定義系統永久生效別名, 將命令別名添加至當前用戶環境配置文件 
[root@localhost ~]# echo "alias ifconfig=‘ifconfig eth0‘" >> ~/.bashrc
//如將別名命令添加至/etc/bashrc , 對所有用戶生效

//3.取消臨時別名
[root@localhost ~]# unalias ifconfig 

2.4.Bash特性:命令流程

當我們執行一個命令, 整個命令執行流程如下:
1.判斷命令是否通過絕對路徑執行
2.判斷命令是否存在別名
3.判斷用戶輸入的是內部命令還是外部命令
4.內部命令直接執行, 外部命令檢測是否存在緩存
5.檢測PATH路徑, 有執行, 無報錯

內部命令: shell程序自帶的命令。
外部命令: 在系統PATH變量的某個路徑下的可執行程序。

使用type命令檢測用戶輸入的命令屬於內部命令還是外部命令。

//cd命令屬於shell內部命令
[root@linux-node1 ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd
//ping屬於外部命令, 同時會打印當前命令路徑
[root@localhost ~]# type -a  ping
ping is /bin/ping

PATH變量定義的路徑, 作用是告訴Bash執行的外部命令存放的位置,Bash會在這些路徑中進行逐個掃描。

//echo所見即所得
[root@localhost ~]# echo "123"
123
[root@localhost ~]# echo -e "123 \n456"
123
456

//打印當前環境變量目錄
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

//PATH由多個路徑組成,每個路徑值之間用冒號間隔,對這些路徑的增加和刪除操作都將影響到Bash解釋器對Linux命令的查找。

//修改PATH變量
[root@localhost ~]# PATH=/soft/bin:$PATH
//寫入/etc/profile配置文件永久生效
echo ‘export PATH=/soft/bin:$PATH‘ >> /etc/profile

事實上執行過的外部命令都會保存在內存緩存中, 當再次執行相同的命令, 會通過緩存調取執行, 也就意味著不會搜索PATH路徑。

//表緩存命令所在位置
[root@localhost ~]# hash
hits    command
   1    /usr/bin/tty
   3    /sbin/ifconfig

//已緩存命令,如果移動位置會導致無法找到該命令
[root@localhost ~]# mv /sbin/ifconfig /bin/
[root@localhost ~]# ifconfig
-bash: /sbin/ifconfig: No such file or directory

//刪除緩存過的ifconfig命令, 即可執行
[root@localhost ~]# hash -d ifconfig
[root@localhost ~]# ifconfig

//當然可以情況緩存表
[root@localhost ~]# hash -r

//命令緩存hash需要註意如下情況:
1.如果執行外部命令1次就會對該命令進行緩存
2.如果將命令移動了位置
    a.使用絕對路徑執行
    b.刪除hash表的緩存指令

總結, 當我們執行了一個ping命令之後, 整個命令執行的流程步驟如下:

1.檢查執行的是否是絕對路徑執行
2.檢查該ping命令是否存在別名
3.檢查該ping命令是內部命令還是外部命令
4.如果是內部指令直接執行, 如果是外部命令
5.檢測該命令是否有緩存,如果沒有,查找PATH變量
6.檢查PATH路徑直到查找到該命令然後執行
7.如果沒有找到該命令則返回錯誤。command not found

2.5.Bash特性:路徑展開

Linux Shell下路徑展開用花括號包括, 逗號分隔, 這樣花括號裏的內容會被展開形成列表。

[root@localhost ~]# mkdir /tmp/zz/a/b /tmp/yy/a/b -pv
mkdir: created directory `/tmp/zz‘
mkdir: created directory `/tmp/zz/a‘
mkdir: created directory `/tmp/zz/a/b‘
mkdir: created directory `/tmp/yy‘
mkdir: created directory `/tmp/yy/a‘
mkdir: created directory `/tmp/yy/a/b‘

//刪除目錄
[root@localhost ~]# rm -rf /tmp/{zz,yy}

//通過路徑展開方式創建目錄
[root@localhost ~]# mkdir /tmp/{zz,yy}/a/b -pv
mkdir: created directory `/tmp/zz‘
mkdir: created directory `/tmp/zz/a‘
mkdir: created directory `/tmp/zz/a/b‘
mkdir: created directory `/tmp/yy‘
mkdir: created directory `/tmp/yy/a‘
mkdir: created directory `/tmp/yy/a/b‘

思考:在/tmp 路徑下創建以下目錄 
etc/init.d
etc/sysconfig
usr/lib
usr/bin
usr/include
var/spool
var/run 
proc 
sys
bin

2.6.Bash特性:轉義字符

Shell解釋器提供了非常豐富的轉義字符, 來實現字符處理以及命令替換。

4類常用轉義字符

反斜杠(\):使反斜杠後面的一個變量變為字符串。
單引號(‘‘):轉義其中所有的變量為單純的字符串。
雙引號(""):保留其中的變量屬性,不進行轉義處理。
反引號(``):把其中的命令執行後返回結果。

//將特殊字符轉換為正常字符
[root@localhost ~]# echo "shoping is $500"
shoping is 00
[root@localhost ~]# echo "shoping is \$500"
shoping is $500
//轉義其中特殊字符為普通字符串
[root@localhost ~]# echo ‘shoping is $500‘
shoping is $500

//使用$()實現命令替換
[root@localhost ~]# echo "The Directory is $(pwd)"
The Directory is /root
//使用``實現命令替換
[root@localhost ~]# echo "The Directory is `pwd`"
The Directory is /root

//轉義其中所有的變量為單純的字符串
[root@localhost ~]# touch file-`date +%F-%H-%S`
[root@localhost ~]# ls
file-2017-12-03-04-18

[root@localhost ~]# touch ‘file-`date +%F-%H-%S`‘
[root@localhost ~]# ls
file-2017-12-03-04-18  file-`date +%F-%H-%S`

2.7.Bash特性:獲取幫助

1.通過man命令獲取幫助

手冊的常見級別: 1(普通用戶命令手冊) , 5(配置文件手冊), 8(管理員命令手冊)
g : 回到手冊的頂部
G : 去到文檔的底部
/ : 輸入要搜索的關鍵字,進行文檔搜索
q: 退出文檔
回車: 往下滾動一行
空格鍵: 往下翻一頁
man -a passwd
man  5 passwd
man  1 passwd
man -k passw  找到所有的包含passwd關鍵字的手冊並且列出來

2.通過info或pinfo獲得幫助

首頁尋找Textinfo文檔,如果沒有,強制打開對應的Man文檔
    與vi風格類似,快捷鍵:
        空格:翻頁
        HOME: 返回頁面頂部
        END:返回頁面底部
        上箭頭: 光標上移動一行
        下箭頭: 光標下移動以行
        左箭頭: 返回上一章節
        右箭頭: 瀏覽光標所在章節
        d: 回到手冊首頁
        q: 退出手冊

強制打開指定級別的man文檔
$ pinfo -m 5 passwd

02.Linux系統Bash初識