1、Bash基礎
1.1 Bash簡介
? ? ? ? 從前邊操作系統的組成介紹中,我們可以知道操作系統為上層用戶提供的與內核進行交互的接口稱為shell,其在系統中的位置如下圖所示,shell作為內核和用戶之間的中介,接收用戶發送的指令,將其解析為內核可識別的指令(系統調用)下發給內核,并將執行結果返回給用戶,從而實現用戶的需求,所以shell也叫命令解析器。
????????shell按照其接口類型主要可以分兩類:
????????圖形界面shell(Graphical User Interface shell):為用戶提供圖形化操作界面,用戶通過圖標、菜單、窗口等可視化元素與內核進行交互。如:Windows Explorer 和 Linux的 X window manager、GNOME、KDE 等都是典型的GUI Shell,這種 shell 對普通用戶來說更加友好,但資源占用率較高。
????????命令行式shell(Command Line Interface shell):為用戶提供字符操作界面,用戶通過輸入文本命令與內核進行交互。如 Windows 的??CMD 和 Linux 的 Bash 就是典型的 CLI Shell,這種 shell 對于維護和開發人員來說更加高效,且資源占用更低。????????shell有兩種工作模式:
????????交互式:用戶登錄shell的交互式界面,shell持續等待接收用戶從標準輸入設備(如鍵盤、鼠標等)輸入的指令,執行完畢后將結果返回給標準輸出設備(如顯示屏),用戶主動退出登錄界面后,shell才會停止。? ? ? ? 非交互式:shell自動讀取并執行保存在文件中的指令(本質上也是一些命令組合),完成特定的任務,不需要與用戶交互,讀取和執行完畢后自動結束。
????????Linux系統下的?shell 一般指的是命令行式的 shell,當前主流的 shell 是 Bash,Bash 是現代 Unix/Linux 系統默認的 shell。
????????Linux系統下支持的 shell 主要有以下幾種類型:
????????1)Bourne Shell (sh):Unix系統的原始Shell,特點是語法簡潔,但缺乏命令歷史、補全等交互式功能。
? ? ? ? 2)C Shell (csh) & Tenex C Shell (tcsh):csh和tcsh采用C語言語法風格,支持作業控制和歷史命令,但csh由于設計存在缺陷后被tcsh取代,這兩種 shell 適合熟悉C語言的用戶,但腳本兼容性較差。
? ? ? ? 3)Korn Shell (ksh):結合了 sh 和 C Shell 優點,兼容POSIX,支持高級腳本特性,提供關聯數組和浮點運算,性能優于bash,適合高性能場景。
? ? ? ? 4)Bourne Again Shell(bash):sh的增強版,融合了 csh、ksh 的特性,擴展了交互功能,支持命令歷史、別名、腳本調試、數組等。
? ? ? ? 5)Z Shell (zsh):bash的擴展版本,注重用戶體驗和定制化,支持主題插件(如Oh My Zsh)、智能補全、拼寫糾正等功能,適合使用交互式終端的開發者。
? ? ? ? Bash擁有良好的兼容性和強大的功能,其主要特性如下:
? ? ? ? 1)支持交互式操作:用戶可以直接輸入命令對系統進行管理和維護,同時提供歷史記錄、命令補全、別名定義等交互特性。
? ? ? ? 2)支持腳本編程能力(非交互式操作):支持變量定義、條件判斷語句、循環語句、函數定義等編程結構,用戶可以使用這些元素編寫自動化腳本來實現自己的需求。
? ? ? ? 3)支持管道、重定向、通配符等高級特性
? ? ? ? Bash是我們操作Linux系統的基本工具,Linux系統的大多數管理和維護操作(如服務部署、腳本開發、文件批處理、定時任務、日志監控等)都是通過 Bash 來完成,所以了解Bash是我們熟悉Linux的第一步。
????????裝完系統后,通過遠程登錄或者本地 terminal 打開的就是一個交互式的Bash界面,如下圖所示,在這個界面用戶就可以通過命令與系統進行交互:
1.2?Bash命令
1.2.1 命令提示符
? ? ? ? 登錄到Bash交互界面后,用戶可以輸入各種命令對系統進行管理和維護,可以看到每一行輸入光標前都會自動生成一串 [ ] 包起來的固定字符串,這個我們把它稱為命令提示符。命令提示符一般由3部分組成:用戶名/主機名和工作目錄
? ? ? ? root 表示當前登錄的用戶名
? ? ? ? 這個提示符的格式也可以通過修改環境變量進行自定義,暫時可以不需要關注,了解了環境變量之后再去研究。
1.2.2?命令格式
? ? ? ? Bash下的命令通常都遵循一定的規范,其通用格式如下:
????????命令關鍵字?[命令參數] [命令對象]
????????命令關鍵字:命令的名稱,一般是對應可執行的二進制程序的名字或別名,是一個命令的必要組成部分。
????????命令參數:命令的入參,通過傳入不同參數可以對命令的執行流程和輸出內容進行調整,是一個命令的可選項,如果不指定以默認參數執行和輸出。
????????命令對象:命令作用的對象,一般指要處理的字符串、文件、目錄、用戶等資源,是一個命令的可選項,如果不指定,以默認對象執行。? ? ??
????????注:命令名稱、命令參數、命令對象之間用空格作為分隔。
? ? ? ? 注:命令字符對大小寫敏感。
???????交互界面輸完命令后,回車表示輸入結束,Bash會解析和執行輸入的命令,執行完畢后將結果輸出到Bash界面,如下為一些命令示例:
[root@localhost ~]# cat /etc/system-release # 查看系統版本(攜帶命令對象)
CentOS Linux release 7.9.2009 (Core) # 命令輸出
[root@localhost ~]# uname -r # 查看內核版本(攜帶一個命令參數)
3.10.0-1160.el7.x86_64 # 命令輸出
[root@localhost ~]# arch # 查看CPU架構(不攜帶參數)
x86_64 # 命令輸出
[root@localhost ~]# cat -n /etc/shells # 查看系統支持的shell類型(同時攜帶命令參數和命令對象)1 /bin/sh # 命令輸出2 /bin/bash3 /usr/bin/sh4 /usr/bin/bash5 /bin/tcsh6 /bin/csh
????????命令參數格式:不同命令支持的參數不同,一條命令可以同時攜帶多個參數,多個參數以空格分隔,有些參數本身也可以攜帶入參。
????????參數一般有兩種表示格式(有些命令參數同時支持兩種格式,有些命令參數只支持其中一種格式):
????????長格式:-- 加完整的參數名稱,這種格式可讀性更高
????????短格式:- 加參數單個字母的縮寫,這種格式使用更加便捷
? ? ? ? 如 uname的短格式參數 -r,對應的長格式參數是?--kernel-release?,這兩種是等價的
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64
[root@localhost ~]# uname --kernel-release
3.10.0-1160.el7.x86_64
????????一般對命令參數比較熟悉之后,主要還是以使用短格式為主。
? ? ? ? 參數合并:多個短格式參數可以進行合并(長格式不行),合并后僅保留一個 - 號即可(參數合并時如果有要加操作對象的參數,這個參數必須放在最后)。
????????如查看當前目錄下文件列表的命令 ls,攜帶兩個參數?-l -h 可以合并為 -lh:
[root@localhost ~]# ls -l -h
total 8.0K
-rw-------. 1 root root 1.6K Jun 26 19:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.6K Jun 26 19:14 initial-setup-ks.cfg
[root@localhost ~]# ls -lh
total 8.0K
-rw-------. 1 root root 1.6K Jun 26 19:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.6K Jun 26 19:14 initial-setup-ks.cfg
? ? ? ?命令注釋:添加 # 可以對Bash中輸入的內容進行注釋,# 到行尾之間的字符不會被解析和執行。
[root@localhost ~]# # uname -r this is a comment
[root@localhost ~]#
????????命令分隔:一般一行只輸入一條命令,Bash只有讀到行尾的回車才會認為一次輸入結束了,將所有輸入內容作為一條命令進行解析執行,如果一行要輸入多條命令,可以用 ; 進行分隔,Bash讀到 ;也會認為一次輸入結束了,將前邊的輸入解析執行完之后再繼續解析后邊的輸入。
[root@localhost ~]# cat /etc/system-release; uname -r; arch
CentOS Linux release 7.9.2009 (Core)
3.10.0-1160.el7.x86_64
x86_64
? ? ? ? 命令換行:如果命令太長要跨行輸入,可以在行尾使用 \ 表示續行,回車后Bash會自動忽略本行尾的回車符,將 \ 后一行的內容跟前邊的內容當做一次輸入進行解析。
[root@localhost ~]# cat /etc/system-\
> release
CentOS Linux release 7.9.2009 (Core)
1.2.3?命令類型
? ? ? ? Bash下可執行的命令分為兩種類型:
? ? ? ? 內置命令:bash解釋器自帶的命令,可以直接執行,不需要調用外部程序,執行速度快
? ? ? ? 外部命令:外部可執行文件提供的命令,需要通過子進程執行,執行速度慢
? ? ? ? 內置命令優先級高于外部命令,如果一條命令同時有內置版本和外部版本,則優先執行內置的版本。
? ? ? ?通過 type?或?command 命令可以判斷一條命令時內置命令還是外部命令
? ? ? ? type判斷命令類型:type?<cmd-name>?
[root@localhost ~]# type date
date is /usr/bin/date # 顯示二進制可執行文件路徑表示是外部命令
[root@localhost ~]# type pwd
pwd is a shell builtin # 顯示shell builtin表示內置命令
? ? ? ? command判斷命令類型:command -V <cmd-name>
[root@localhost ~]# command -V echo
echo is a shell builtin # 顯示shell builtin表示內置命令
[root@localhost ~]# command -V uname
uname is hashed (/usr/bin/uname) # 顯示二進制可執行文件路徑表示外部命令
? ? ? ? 外部命令顯示hashed,表示這條命令執行過,bash會自動緩存其可執行文件路徑,以便下次調用。
? ? ? ? 注:這個命令類型一般不需要關注,了解即可。
1.2.4?命令幫助????????
? ? ? ? ?Bash下的命令繁多,好在Bash提供了多種命令幫助方式,可以幫助我們快速了解一個命令的基本功能和使用方法,而不需要純靠鋼鐵記憶。常用的命令幫助有以下幾種:? ? ? ?
1)whatis—查看命令基本功能
????????whatis本身也是一個命令,用它可以查看指定命令的基本功能描述(但也只能看個功能描述),其用法如下:
????????格式:whatis [命令名稱]
????????如查看 uname?命令的功能概述可知其作用是查看系統信息和內核信息:
[root@localhost ~]# whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
2)help—查看內置命令使用幫助
????????通過help命令可以查看Bash內置命令的基本用法,其用法如下:
????????格式:help [命令名稱]
????????如查看 history 命令的基本用法,可以看到其使用格式和參數說明:
[root@localhost ~]# help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]Display or manipulate the history list.Display the history list with line numbers, prefixing each modifiedentry with a `*'. An argument of N lists only the last N entries.Options:-c clear the history list by deleting all of the entries-d offset delete the history entry at offset OFFSET.-a append history lines from this session to the history file-n read all history lines not already read from the history file-r read the history file and append the contents to the historylist-w write the current history to the history fileand append them to the history list
......
? ? ? ? help只能查看Bash內置的命令,不支持外部命令,直接輸入help不帶參數,可以看到其支持的內置命令。
3)--help或 -h 參數—查看命令使用幫助
????????--help或 -h是命令本身支持的幫助參數,大部分命令都支持(有些支持長格式有些支持短格式),通過該參數可以查看當前命令的基本用法以及其支持的參數列表,這是最實用的幫助方法,其用法如下:
????????格式:[命令名稱] --help/-h
? ? ? ? 如查看 ls 命令的用法,可以看到其使用格式和支持的參數列表:
[root@localhost ~]# ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.Mandatory arguments to long options are mandatory for short options too.-a, --all do not ignore entries starting with .-A, --almost-all do not list implied . and ..--author with -l, print the author of each file-b, --escape print C-style escapes for nongraphic characters--block-size=SIZE scale sizes by SIZE before printing them; e.g.,'--block-size=M' prints sizes in units of1,048,576 bytes; see SIZE format below-B, --ignore-backups do not list implied entries ending with ~
......
4)man
? ? ? ? 如果-h/--help還不能滿足你,就可以考慮man命令了,通過 man命令查看指定命令或配置文件的詳細說明手冊(前提是對應命令帶了說明手冊,如果沒帶的話看不到),其用法如下:
????????格式:man [命令關鍵字/配置文件]????????????????
????????如查看 ls 命令的說明手冊 man ls:
LS(1) User Commands LS(1)NAMEls - list directory contentsSYNOPSISls [OPTION]... [FILE]...DESCRIPTIONList information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftu‐vSUX nor --sort is specified.Mandatory arguments to long options are mandatory for short options too.-a, --alldo not ignore entries starting with .-A, --almost-alldo not list implied . and ..--authorwith -l, print the author of each file-b, --escapeprint C-style escapes for nongraphic characters--block-size=SIZEscale sizes by SIZE before printing them; e.g., '--block-size=M' prints sizes in units of 1,048,576 bytes;see SIZE format below-B, --ignore-backupsdo not list implied entries ending with ~
......
? ? ? ? man說明手冊的內容結構一般包含以下幾部分:
結構名稱 | 含義 |
NAME | 命令名稱 |
SYNOPSIS | 命令使用格式 |
DESCRIPTION | 命令的用法說明 |
EXAMPLES | 命令使用示例 |
OVERVIEW | 命令概述 |
DEFAULTS | 默認操作 |
OPTIONS | 選項說明 |
ENVIRONMENT | 環境變量 |
FILES | 涉及的文件 |
Author | 命令手冊作者 |
COPYRIGHT | 版權信息 |
SEE ALSO | 參考資料 |
? ? ? ?
????????通過man讀取說明手冊時會進入閱讀模式,該模式下常用快捷鍵如下:
h | 幫助信息 |
q | 退出閱讀模式 |
空格/Page Down | 向下翻頁 |
Page Up | 向上翻頁 |
Home | 跳到首頁 |
End | 跳到尾頁 |
/ | 從上至下搜索指定關鍵字,如 /hello |
? | 從下至上搜索指定關鍵字,如?hello |
n | 跳到下一個搜索到的關鍵字 |
N | 跳到上一個搜索到的關鍵字 |
空格鍵? ? ? ? ? ?
? ? ? ? 上邊的說明看看就行,用的時候再去了解。大部分場景使用 -h/--help就可以滿足需求,但如果想知道一些參數細節或者想通過某個命令實現特殊的功能,網上又查不到相關資料時,不妨翻一翻man手冊,可能會有意外的發現。
5)info/pinfo
????????info是Linux默認的標準文檔瀏覽工具,用于查看GNU軟件的詳細文檔,通常以超文本形式組織內容,支持超鏈接跳轉和層次化導航。pinfo是info
的增強版,提供了更友好的用戶界面,支持顏色高亮、鼠標操作以及更直觀的導航方式。跟man相比info/pinfo可以提供更加詳細的結構化、超鏈接式手冊,適用于學習一些復雜的GNU工具,如gcc、bash等。其用法如下:
????????格式:info/pinfo?[命令關鍵字]??????????
? ? ? ? 如查看bash的說明手冊(q退出):pinfo bash
1.2.5?命令行快捷鍵
? ? ? ? Bash命令行界面還支持很多快捷鍵,可以提升操作效率,這里列出一些常用的:
快捷鍵 | 作用 |
Ctrl + A 或 Home | 光標移到當前行首 |
Ctrl + E 或 End | 光標移到當前行尾 |
Ctrl + U | 將當前光標處一直到行頭的字符都刪掉 |
Ctrl + K | 將當前光標處一直到行尾的字符都刪掉 |
Alt + R | 刪除整行 |
Ctrl + Y | 粘貼最近刪除的內容 |
Up/Down | 查看歷史緩存命令 |
Esc松手(2s)后按 . 或 Alt+ .?? | 調用上一條命令最后一部分(空格作為分隔符) |
Ctrl + R | 根據關鍵詞搜索歷史命令 |
Tab | 根據當前輸入補全命令、文件名或路徑 |
Ctrl + C | 終止當前正在執行的命令或取消本次輸入 |
Ctrl + Z | 將當前運行的命令掛起到后臺 |
Ctrl + L | 清除屏幕上所有內容 |
1.2.6?命令補全
? ? ? ? 命令補全是 Bash 提供的一個很方便的特性,使用 Tab 快捷鍵就可以輕松完成命令或文件路徑補全,不需要記憶完整的命令名或文件名也行,提高操作效率,其基本用法如下:
? ? ? ? 1)不完整命令關鍵字或文件名+Tab
? ? ? ? Tab x1:如果當前環境有跟對應關鍵字唯一匹配的命令或文件,則直接進行補全,如果沒有匹配項或匹配項不唯一,則不進行補全。
? ? ? ? Tab x2:列出當前環境下所有跟對應關鍵字匹配的命令或文件
????????如下圖所示,直接輸入 unam+Tab,由于系統中以 unam 開頭的命令只有 uname,所以會自動進行補全,直接敲 un+Tab,由于以 un 開頭的命令不唯一,所以不會進行補全,這種情況敲2次Tab 就會列出環境上所有以 un 開頭的命令:
[root@localhost ~]# # unam + Tab
[root@localhost ~]# uname
[root@localhost ~]# # un + Tab
[root@localhost ~]# un
[root@localhost ~]# # un + Tabx2
[root@localhost ~]# un
unalias uncompress unicode_stop unix-lpr.sh unlz4 unshare unzip
uname unexpand uniq unix_update unpack200 until unzipsfx
? ? ? ? 同樣對于文件或目錄名補全規則也是一樣,如下圖所示,cat 查看文件內容時,文件名輸入 /etc/os+Tab,由于以? /etc/ 目錄下以 os 開頭的文件只有 os-release,所以會自動進行補全,而如果文件名只輸入?/etc/o+Tab,/etc/ 目錄下以 os 開頭的文件不唯一,所以不會進行補全,再敲一次Tab則會列出 /etc/ 目錄下所有以 o 開頭的文件(或目錄):
[root@localhost ~]# # cat /etc/os + Tab
[root@localhost ~]# cat /etc/os-release
[root@localhost ~]# # cat /etc/o + Tab
[root@localhost ~]# cat /etc/o
[root@localhost ~]# # cat /etc/o + Tabx2
[root@localhost ~]# cat /etc/o
oddjob/ oddjobd.conf oddjobd.conf.d/ openldap/ opt/ os-release
? ? ? ? ? 2)完整命令關鍵字或文件名+空格+Tabx2
? ? ? ? 直接在完整的命令關鍵字或文件名后空格,再敲2次 Tab 默認會列出當前目錄下的所有文件或目錄,相當于敲了一次 ls 命令,列出命令可操作的文件對象。
[root@localhost ~]# # cat + Tabx2
[root@localhost ~]# cat
anaconda-ks.cfg .config/ .esd_auth .local/ Videos/
.bash_history .cshrc eth01.pcap Music/ .xauthZAdD5o
.bash_logout .dbus/ eth0.pcap Pictures/
.bash_profile Desktop/ .ICEauthority Public/
.bashrc Documents/ initial-setup-ks.cfg .tcshrc
.cache/ Downloads/ .lesshst Templates/
????????注:命令補全由?bash-completion 包支持,如果系統安裝使用的是最小化安裝方式,可能不會自帶該包,需要自行補包。
1.2.7?歷史命令
? ? ? ? Bash會自動緩存命令行界面執行過的歷史命令,默認保留最近100條命令,記錄歷史命令一方面可以回溯歷史操作,另一方面可以方便再次調用,查看和調用歷史命令的方法有如下幾種:
? ? ? ? 1)history命令
????????通過 history 命令可以查看當前用戶緩存中的所有歷史命令,可以看到每條歷史命令會從1開始編號,ID越小,命令越早,通過?!! 可以調用上一條命令,通過 !<key-word> 可以調用最近一條包含key-word的歷史命令,通過 ! <ID> 就可以直接調用指定編號的歷史命令,如這里調用第2條歷史命令
[root@localhost ~]# history 1 uname -r2 arch 3 cat /etc/os-release 4 ls5 type date6 help7 whatis ls8 man ls9 pinfo bash10 cat /etc/system-release11 history
[root@localhost ~]# !2
arch
x86_64
????????2)Up/Down方向鍵
????????命令行界面通過 Up/Down 方向鍵可以逐條調出history緩存中的歷史命令,Up是上一條,Down是下一條,如這里向上方向鍵翻3次就可以看到之前執行的命令,回車可以直接執行,:
[root@localhost ~]# cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)
? ? ? ? 3)Ctrl + R 快捷鍵
????????通過 Ctrl + R 快捷鍵可以使用指定的關鍵字從歷史命令緩存中搜索匹配的命令,如下圖所示,直接在命令行按 Ctrl + R 即可進入搜索模式,輸入關鍵字 una,后邊就顯示了從歷史命令緩存中搜索到的包含una的命令 uname -r,回車即可執行搜索到的命令:
[root@localhost ~]#
(reverse-i-search)`una': uname -r
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64
????????history中記錄的歷史命令都保存在內存中,為了使其持久化保存,Bash會在用戶退出登錄后,自動將?history 緩存中的歷史命令追加到用戶家目錄的 .bash_history 文件中,用戶下次登錄時Bash會自動將該文件中的所有命令重新加載到 history 緩存中。
[root@localhost ~]# cat .bash_history
uname -r
arch
cat /etc/os-release
ls
type date
help
whatis ls
man ls
pinfo bash
cat /etc/system-release
history
arch
cat /etc/system-release
uname -r
? ? ? ? history命令緩存管理:
? ? ? ? 清除歷史命令緩存(不影響 .bash_history 中的記錄):history -c
? ? ? ? 清除歷史命令緩存中指定記錄:history -d <ID>
? ? ? ? 將當前歷史命令緩存追加到??.bash_history 文件:history -a
????????將當前歷史命令緩存寫入??.bash_history 文件(覆蓋):history -w
????????history緩存和?.bash_history 文件可記錄的最大歷史命令條數可以通過?HISTSIZE 和 HISTFILESIZE 環境變量來進行設置,這個可以后續再環境變量部分了解。
1.2.8?命令別名
? ? ? ? 命令別名是Bash的另一個特性,顧名思義,就是為指定的命令設置一個別名,通過別名可以直接調用對應的命令,設置別名的方式如下:
? ? ? ?定義別名:alias <命令別名>="實際命令"
? ? ? ?取消別名:unalias <命令別名>
? ? ? ? 命令行界面通過 alias 命令可以為當前用戶設置命令別名,不過這種方式只有臨時生效,如果需要永久生效,需要將其寫入用戶的環境配置文件中(這個后邊講解到環境變量的時候再說明)。
? ? ? ? 使用?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'
? ? ? ? 注:如果別名跟已有的系統命令名稱相同,則會覆蓋已有的系統命令(這個覆蓋不是指系統命令不存在了,而是在調用時如果發現該命令有別名,就會直接調用別名指定的命令了,相當于繞過了系統命令)。
? ? ? ? 注:如果為一個已有的別名定義了一個名字相同的別名命令,后邊定義的會把前邊的覆蓋掉。
? ? ? ? 命令別名一般有以下幾種使用場景:
? ? ? ? 1)為比較長或比較復雜的命令設置一個較短的別名,方便記憶和調用
? ? ? ? ?如我們為之前查看系統版本的命令 cat /etc/os-relase 設置一個別名 os_ver,這樣直接執行os_ver 就可以查看對應的系統版本了
[root@localhost ~]# alias os_ver="cat /etc/os-release"
[root@localhost ~]# os_ver
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
????????2)為一些系統命令設置別名,修改默認參數,使其執行更加安全
? ? ? ? 系統命令 rm 是用來刪除文件的,以默認參數執行時,不會對用戶進行提示直接刪除,而加了 -i 參數后,會在用戶進行刪除操作時進行提示,待用戶確認后再刪除。
? ? ? ? 如前邊看到的,系統自帶的別名 alias rm='rm -i',覆蓋了系統命令 rm,所以用戶執行 rm 命令時,就會默認執行帶 -i 參數的 rm 命令,從而增加了操作的安全性,防止誤刪,而我們取消這個別名后,可以看到執行 rm 刪除文件時沒有任何提示。
[root@localhost ~]# alias rm
alias rm='rm -i'
[root@localhost ~]# rm anaconda-ks.cfg
rm: remove regular file ‘anaconda-ks.cfg’? n
[root@localhost ~]# unalias rm
[root@localhost ~]# rm anaconda-ks.cfg
[root@localhost ~]#
? ? ? ? 3)篡改系統命令
? ? ? ? 這種場景一般是為系統命令設置了別名,在原有命令的基礎上增加了一些處理流程,甚至直接執行一些跟原始命令無關的內容。
????????如病毒程序或流氓軟件可以通過設置別名篡改系統命令,實現破壞或病毒植入的目的,比如將系統命令?ls 命令設置成執行一段惡意代碼,用戶執行該命令時就會變成執行一段惡意代碼,如下例所示(echo是一個可以將指定內容輸出到終端的命令)
[root@localhost ~]# ls
Desktop Downloads initial-setup-ks.cfg Pictures sudo-1.9.17-2.el7.x86_64.rpm Videos
Documents eth01.pcap Music Public Templates
[root@localhost ~]# alias ls="echo 'do something bad'"
[root@localhost ~]# ls
do something bad
? ? ? ? 但這種篡改在某些故障排查的場景也能發揮一些用處,比如我們發現系統中毒了,老是有進程調用 rm命令去亂刪東西,但又不知道是哪個進程調的,就可以自定義一個 rm 別名,直接將命令改為打印調用該命令的進程號和父進程號,這樣一方面可以阻止 rm 被實際執行,一方面也可以追蹤調用 rm 的進程信息:
[root@localhost ~]# alias rm="echo 'hit rm! PID=$$,PPID=$PPID'"
[root@localhost ~]# rm .bash_history
hit rm! PID=32414,PPID=32409 .bash_history
? ? ? ? 總結一下,別名的使用比較靈活,但需要慎用,自定義的別名一般沒有明確規范,不方便維護,而為系統命令設置別名會導致命令功能或輸出與默認不符,影響應用程序或其它用戶的正常調用,需要在明確其使用目的和使用場景的情況下使用。
1.3 幾個開胃命令
? ? ? ? 通過上一節我們大概知道了Bash命令的格式、用法和一些基本特性,下邊就再通過幾個簡單的命令進一步熟悉一下Bash命令的使用。
1.3.1 logout/exit—退出登錄
????????logout 命令可以退出Bash交互界面,退出之后需要重新登錄。
????????exit 命令也有退出登錄的功能,但是如果當前是在子Bash進程里,不會直接退出登錄,而是退到父Bash進程。? ?
1.3.2 clear—清屏
? ? ? ? clear 命令可以將當前終端界面之前輸入的命令和輸出都清除掉,返回一個干凈的Bash交互界面。
1.3.3?shutdown/reboot—關機/重啟
? ? ? ? shutdown是最常用的關機命令,可以用于關機、定時關機、重啟,關機前會自動向所有終端用戶發送提醒。通過 --help 參數可以查看其使用幫助:
[root@localhost ~]# shutdown --help
shutdown [OPTIONS...] [TIME] [WALL...]Shut down the system.--help Show this help-H --halt Halt the machine-P --poweroff Power-off the machine-r --reboot Reboot the machine-h Equivalent to --poweroff, overridden by --halt-k Don't halt/power-off/reboot, just send warnings--no-wall Don't send wall message before halt/power-off/reboot-c Cancel a pending shutdown
? ? ? ? shutdown常見用法:
shutdown # 安全關機,待所有進程和服務安全退出后關機
shutdown -h now? ?# 立即關機
shutdown -r now # 立即重啟
shutdown -H # 調用halt進行關機
shutdown -P # 調用poweroff進行斷電關機
shutdown -h [hh:mm|+m] # 定時關機
????????poweroff 和 halt 命令也可以用于關機,區別是 poweroff 會斷電,而且不一定會等待所有進程退出,所以安全性較差,halt 命令關機不一定會斷電。
????????reboot 命令則常用于重啟系統,也可以添加額外參數,通過 --help 參數查看幫助。
1.3.4?hostname/hostnamectl—查看主機名
????????每個Linux系統都有一個名稱標識,稱為主機名,在 Bash 命令提示符中也可以看到(可能不會顯示完整的主機名),正常情況下就把它當做一個便于識別的名字就好,在域名服務中會有特殊的用處,通過 hostname 命令可以進行主機名相關的配置。? ? ? ??
? ? ? ? 通過不加參數的 hostname 命令即可看到當前系統的主機名:
[root@localhost ~]# hostname
localhost.localdomain
? ? ? ? 通過 hostname <name> 可以修改主機名,修改之后重新登錄 Bash終端生效,但這種修改方式只是修改了環境變量,臨時生效,重啟后會失效。
[root@localhost ~]# hostname localhost.localdomain
[root@localhost ~]# hostname myserver
[root@localhost ~]# logoutLast login: Tue Jul 29 17:19:33 2025 from 10.54.15.100
[root@myserver ~]# hostname
myserver
? ? ? ? 通過 hostnamectl 命令可以永久修改主機名。主機名的配置實際是保存在 /etc/hostname 配置文件中,通過 hostnamectl set-hostname <name> 命令可以把修改后的主機名寫入該文件(hostname不會),從而使其在系統重啟后仍舊生效。
[root@myserver ~]# cat /etc/hostname
localhost.localdomain
[root@myserver ~]# hostnamectl set-hostname centos7
[root@myserver ~]# cat /etc/hostname
centos7
[root@myserver ~]# logoutLast login: Tue Jul 29 19:37:20 2025 from 10.54.15.100
[root@centos7 ~]# hostname
centos7
? ? ? ? hostname 和 hostnamectl 也支持額外的參數,有需要的話可以通過?-h 參數查看幫助信息。
1.3.5?date/timedatectl—查看和修改系統時間
? ? ? ? date 命令可以查看或修改系統的本地時間(標準時間+時區時差)。
? ? ? ? date常見用法(--help查看其它用法):
[root@localhost ~]# date # 1、以默認格式輸出時間
Tue Jul 29 20:27:53 CST 2025
[root@localhost ~]# date "+%F %T" # 2、以 [年-月-日 時:分:秒] 的格式輸出時間
2025-07-29 20:30:05
[root@localhost ~]# date "+%Y/%m/%d %H:%M:%S" # 3、以指定的格式輸出時間
2025/07/29 20:30:41
[root@localhost ~]# date -s "20250918 10:10:10" # 4、修改本地時間,輸入格式為 [年月日 時:分:秒]
Thu Sep 18 10:10:10 CST 2025
? ? ? ? date 命令修改的時間只是臨時生效,系統重啟后會丟失,要永久修改系統時間可以通過timedatectl 命令實現,
? ? ? ? timdatectl 常見用法(-h查看幫助):
[root@localhost ~]# timedatectl # 1、查看時間狀態Local time: Thu 2025-09-18 10:50:51 CST # 本地時間Universal time: Thu 2025-09-18 02:50:51 UTC # 標準時間RTC time: Tue 2025-07-29 21:30:29 # RTC時間Time zone: Asia/Shanghai (CST, +0800) # 時區NTP enabled: yes
NTP synchronized: no RTC in local TZ: noDST active: n/a
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo # 2、設置時區
[root@localhost ~]# timedatectl set-time "2050-12-24 20:00:00" # 3、輸入格式為 [年-月-日 時:分:秒]
[root@localhost ~]# timedatectl # 4、查看時間狀態Local time: Sat 2050-12-24 20:01:57 JST # 本地時間Universal time: Sat 2050-12-24 11:01:57 UTC # 標準時間RTC time: Sat 2050-12-24 11:01:57 # RTC時間Time zone: Asia/Tokyo (JST, +0900) # 時區信息NTP enabled: no
NTP synchronized: noRTC in local TZ: noDST active: n/a
? ? ? ? cal 命令還可以查看日歷:
1.3.6?echo—打印字符串或變量值
? ? ? ? echo是一個很常用的命令,可以將指定字符串或變量值打印到屏幕(標準輸出)上,也可以通過輸出重定向將輸出內容寫入到文件中。
? ? ? ? 命令格式:echo [參數] [字符串或變量]
????????常用參數:
????????-n:輸出結束后不進行換行
????????-e:對字符串中的轉義符進行解析(默認不解析轉義字符)
[root@localhost ~]# echo "Hello Linux" # 打印字符串到屏幕
Hello Linux
[root@localhost ~]# echo -e "Hello\nLinux" # \n 是轉義字符,表示換行,添加-e參數解析轉義字符
Hello
Linux
[root@localhost ~]# echo "$SHELL" # 打印變量值,$SHELL是系統的環境變量,記錄了當前的shell類型
/bin/bash
[root@localhost ~]# echo "this is a test" > test.log # > 是輸出重定向符,表示將輸出重定向到指定的文件 test.log
[root@localhost ~]# cat test.log # cat 查看文件中的內容
this is a test
? ? ? ? 注:echo 打印的字符串或變量值如果是連續的,可以不加引號,但是如果字符串或變量值中間有空格時必須加雙引號,否則解析會有問題。
? ? ? ? 注:echo 默認不解析字符串中的轉義字符(當做普通字符處理),如果需要解析轉義字符,務必添加 -e 參數
? ? ? ? 環境變量和重定向會在后續Bash進階中進行詳細介紹。
??????