Linux基礎(三)——Bash基礎

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 文件可記錄的最大歷史命令條數可以通過?HISTSIZEHISTFILESIZE 環境變量來進行設置,這個可以后續再環境變量部分了解。

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進階中進行詳細介紹。

??????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91607.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 元編程實戰:動態屬性與數據結構轉換技巧

在處理復雜嵌套的 JSON 數據源時&#xff0c;我們常面臨訪問不便、結構不靈活、字段關聯性差等問題。本文將以 O’Reilly 為 OSCON 2014 提供的 JSON 數據源為例&#xff0c;系統講解如何通過 動態屬性轉換、對象封裝、數據庫映射與特性&#xff08;property&#xff09;機制&a…

Android-側邊導航欄的使用

在學習之前&#xff0c;我們先得知道側邊導航欄是什么&#xff1f;它是一個 可以讓內容從屏幕邊緣滑出的布局容器&#xff0c;由安卓官方提供&#xff0c;用于創建側邊菜單&#xff0c;通常搭配 NavigationView 使用&#xff1b;添加依賴&#xff1a;在app下的build.gradle中添…

lesson30:Python迭代三劍客:可迭代對象、迭代器與生成器深度解析

目錄 一、可迭代對象&#xff1a;迭代的起點 可迭代對象的本質特征 可迭代對象的工作原理 自定義可迭代對象 二、迭代器&#xff1a;狀態化的迭代工具 迭代器協議與核心方法 迭代器的狀態管理 內置迭代器的應用 三、生成器&#xff1a;簡潔高效的迭代器 生成器函數&a…

實時語音流分段識別技術解析:基于WebRTC VAD的智能分割策略

引言 在現代語音識別應用中&#xff0c;實時處理音頻流是一項關鍵技術挑戰。不同于傳統的文件式語音識別&#xff0c;流式處理需要面對音頻數據的不確定性、網絡延遲以及實時性要求等問題。本文將深入解析一個基于WebRTC VAD&#xff08;Voice Activity Detection&#xff09;…

word中rtf格式介紹

RTF&#xff08;Rich Text Format&#xff0c;富文本格式&#xff09;是一種由微軟開發的跨平臺文檔文件格式&#xff0c;用于在不同應用程序和操作系統之間交換格式化文本。以下是對RTF格式的簡要說明&#xff1a; RTF格式特點 跨平臺兼容性&#xff1a;RTF文件可以在多種文字…

Springboot 配置 doris 連接

Springboot 配置 doris 連接 一. 使用 druid 連接池 因為 Doris 的前端&#xff08;FE&#xff09;兼容了 MySQL 協議&#xff0c;可以像連 MySQL 一樣連 Doris。這是 Doris 的一個核心設計特性&#xff0c;目的是方便接入、簡化生態兼容。 首先需要引入 pom 依賴:<dependen…

Linux 系統啟動與 GRUB2 核心操作指南

Linux 系統啟動與 GRUB2 核心操作指南 Linux 系統的啟動過程是一個環環相扣的鏈條&#xff0c;從硬件自檢到用戶登錄&#xff0c;每一步都依賴關鍵組件的協作。其中&#xff0c;GRUB2 引導器和systemd 進程是核心樞紐&#xff0c;而運行級別則決定了系統的啟動狀態。以下是系統…

供應鏈分銷代發源碼:一站式打通供應商供貨、平臺定價、經銷商批發及零售環節

在當前復雜的市場環境中&#xff0c;供應鏈管理成為企業發展的關鍵。尤其對于電商平臺來說&#xff0c;高效、精準的供應鏈管理不僅能提升運營效率&#xff0c;還能增強市場競爭力。為了應對日益復雜的供應鏈挑戰&#xff0c;核貨寶供應鏈分銷代發系統應運而生&#xff0c;旨在…

機器學習、深度學習與數據挖掘:核心技術差異、應用場景與工程實踐指南

技術原理與核心概念數據挖掘作為知識發現的關鍵技術&#xff0c;其核心在于通過算法自動探索數據中的潛在模式。關聯規則挖掘可以發現項目之間的有趣關聯&#xff0c;如經典的"啤酒與尿布"案例&#xff1b;聚類分析能夠將相似對象自動分組&#xff0c;常用于客戶細分…

《C++初階之STL》【stack/queue/priority_queue容器適配器:詳解 + 實現】(附加:deque容器介紹)

【stack/queue/priority_queue容器適配器&#xff1a;詳解 實現】目錄前言&#xff1a;------------標準接口介紹------------一、棧&#xff1a;stack標準模板庫中的stack容器適配器是什么樣的呢&#xff1f;1. 棧的基本操作std::stack::topstd::stack::pushstd::stack::pop2…

Thymeleaf 模板引擎原理

Thymeleaf 的模板文件&#xff0c;本質上是標準的 HTML 文件&#xff0c;只是“加了標記&#xff08; th&#xff1a;&#xff09;的屬性”&#xff0c;讓模板引擎在服務端渲染時能 識別并處理 這些屬性&#xff0c;從而完成數據&#xff08;model&#xff09; 的填充。<!DO…

5、生產Redis高并發分布式鎖實戰

一、核心問題與解決方案 問題本質 #mermaid-svg-W1SnVWZe1AotTtDy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W1SnVWZe1AotTtDy .error-icon{fill:#552222;}#mermaid-svg-W1SnVWZe1AotTtDy .error-text{fill:#5…

CS231n-2017 Lecture8深度學習框架筆記

深度學習硬件&#xff1a;CPU:CPU有數個核心&#xff0c;每個核心可以獨立工作&#xff0c;同時進行多個線程&#xff0c;內存與系統共享GPU&#xff1a;GPU有上千個核心&#xff0c;但每個核心運行速度很慢&#xff0c;適合并行做類似的工作&#xff0c;不能獨立工作&#xff…

以ros的docker鏡像為例,探討docker鏡像的使用

標題以ros的docker鏡像為例&#xff0c;探討docker鏡像的使用&#xff08;待完善&#xff09; 1. docker介紹&#xff08;以ros工程距離&#xff09; &#xff08;1&#xff09;個人理解&#xff1a;docker就是一個容器&#xff0c;主要的作用就是將環境打包好&#xff0c;方…

Android Audio實戰——TimeCheck機制解析(十三)

上一篇文章我們雖然通過 tombstoned Log 推斷出 audioserver 崩潰的原因就是系統調用內核接口時發生阻塞,導致 TimeCheck 檢測超時異常而崩潰,但并沒有實質性的證據證明是 kernel 層出現問題導致的崩潰,因此這里我們繼續看一下 TimeCheck 的檢測原理。 一、TimeCheck機制 T…

飛機大戰小游戲

1.視覺設計&#xff1a;采用柔和的藍紫色漸變背景&#xff0c;營造夢幻感飛機、敵機和子彈使用柔和的糖果色調添加了粒子爆炸效果&#xff0c;增強視覺反饋星星收集物增加游戲趣味性2.游戲機制&#xff1a;玩家使用左右方向鍵控制飛機移動空格鍵發射子彈P鍵暫停游戲擊落敵機獲得…

Linux 啟動服務腳本

1. 創建命令文件# 創建可執行文件 touch 文件名稱 例&#xff1a; touch stopServer.sh2. 命令文件授權# 授權文件可執行權限 chmod 777 文件名稱 例&#xff1a; chmod 777 stopServer.sh3. 停止服務命令編寫#!/bin/bash# 獲取進程號 pidps -ef | grep -- /mnt/apache-tomcat-…

【華為機試】34. 在排序數組中查找元素的第一個和最后一個位置

文章目錄34. 在排序數組中查找元素的第一個和最后一個位置描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路算法分析問題本質分析雙重二分查找詳解左邊界查找過程右邊界查找過程算法流程圖邊界情況分析各種解法對比二分查找變種詳解時間復…

【網絡編程】WebSocket 實現簡易Web多人聊天室

一、實現思路 Web端就是使用html JavaScript來實現頁面&#xff0c;通過WebSocket長連接和服務器保持通訊&#xff0c;協議的payload使用JSON格式封裝 服務端使用C配合第三方庫WebSocket和nlonlohmann庫來實現 二、Web端 2.1 界面顯示 首先&#xff0c;使用html來設計一個…

AI 驅動、設施擴展、驗證器強化、上線 EVM 測試網,Injective 近期動態全更新!

作為一個專注于金融應用、且具有高度可互操作性的高性能 Layer-1 區塊鏈&#xff0c;Injective 自誕生以來便為開發者提供有即插即用的技術模塊&#xff0c;以便開發者能夠更好地搭建新一代 Web3 金融類應用。談及項目發展的愿景和基本定位&#xff0c;創始團隊曾提到希望 Inje…