antony@notes:~/suse$ cat "Work-with-the-Command-Line.md"
Work with the Command Line
Work with the Command Line
:::warning
:::spoiler 目錄
[TOC]
:::
Getting Help at the Command Line
Help Resources
- 命令說明:使用
<command> -h或<command> --help - 手冊頁面:
man [section] command - 關鍵字清單:
man -k keyword - 顯示描述:
whatis command - 資訊頁面:
info command - Software package documentation 在
/usr/share/doc/packages/ - Release Notes 在
/usr/share/doc/release-notes/
Info pages (資訊頁面)有一個樹狀結構,其中包含節點和節點之間的引用。 在第一行中,您可以看到節點的名稱,下一頁節點的節點名稱,上一個節點的名稱以及父節點的名稱。
使用以下快捷鍵進行資訊頁面的導覽:
qQuit (離開)nNext node (前往下一個節點)pPrevious node (前往上一個節點)uUp to parent node (前往父節點)lLast node visited (前往最後瀏覽的節點)bBeginning of node (前往節點的開始)eEnd of node (前往節點的結尾)tTop of node (前往節點的頂部)EnterFollow reference (跟隨引用)DownOne line down (向下移動一行)UpOne line up (向上移動一行)Space、PageDownPage down one screen (向下移動一個屏幕)Backspace、PageUpPage up one screen (向上移動一個屏幕)TabJump to the next reference (跳轉到下一個引用)sSearch in the info page (在資訊頁面中搜索)?List a summary of commands (列出命令的摘要)
Understand the SLE Shell Environment
操作系统的最基本的用户接口
可用的 shells 在 /etc/shells 中列出,例如:
- Bash(Bourne Again Shell,默認)。
- Ash
- C shell
- Korn shell
- Z shell
Shell Environment
Shell environment:
- variables
- functions
- aliases
可以用兩種不同的方式來調用一個 shell :
- Login Shell - 使用者的環境已被設定
- Non-login Shell - 此貝殼程式繼承了現有的環境
登入式 Shell 與非登入式 Shell 的主要區別 :
- 登入式 Shell 需要驗證身份,也就是在執行登入式 Shell 前必須輸入使用者名稱和密碼。
- 如果不需要,那麼它就不是登入式 Shell,而是非登入式 Shell。
- 通常登入式 Shell 是在登入過程的最後一步執行的。登入式 Shell 有特殊的參數設置,這些參數會使其成為互動式 Shell(至少通常是這樣)。
Bash Shell 可以以非互動方式執行,使用一個登入式 Shell,必須包含 --login 參數,以允許其執行程式碼。例如,在測試腳本是否作為登入式 Shell 執行時使用。
登入式 Shell 會讀取比非登入式 Shell 更多的配置文件,以設置某些 Shell 和環境變量。了解哪些 Shell 類型讀取哪些配置文件是很重要的。
Shell Variables and Settings
Global profiles:
/etc/profile/etc/profile.d/*.sh/etc/profile.local
/etc/bash.bashrc/etc/bash_completion.d/*.sh/etc/bash.bashrc.local
/etc/inputrc(bash -> libreadline.so)
- User specific profiles:
~/.profile~/.bashrc~/.alias
Login Shell 的執行順序
/etc/profile/etc/profile.d/*.sh/etc/profile.local~/.profile/etc/bash.bashrc/etc/bash_completion.d/*.sh/etc/bash.bashrc.local/etc/inputrc~/.bashrc~/.alias
non-login shell 的執行順序
/etc/bash.bashrc/etc/bash_completion.d/*.sh/etc/bash.bashrc.local/etc/iputrc~/.bashrc~/.alias
在 SUSE 中,預設可能沒有 /etc/profile.local 檔案。如果有的話,它會在 /etc/profile 設定檔的最後被讀取。
在 SUSE 中預設也不會有 /etc/bash.bashrc.local 和 ~/.alias 檔案。如果這些檔案存在,則會按照上面的圖表所描述的方式被讀取。
值得注意的是,SUSE 提供的 bash 設定檔比預設的 bash 套件和其他 Linux 發行版提供的更多。
如果想瞭解 bash 的預設行為細節,請查閱 bash 手冊頁面。
Shell Aliases
- 定義一個 alias:
alias ALIAS_NAME=”COMMAND”
- 移除一個 alias:
unalias ALIAS_NAME
- 列出以定義的所有 aliases:
alias
- Alias definition file:
~/.alias
Shell History
- 指令歷史紀錄位於
~/.bash_history檔案中。 - 查看歷史: 輸入指令
history - 滾動瀏覽歷史
- <上箭頭>鍵/<下箭頭>鍵
- 搜索歷史上以
<string>開頭的命令<string><PgUp>/<string><PgDn>
- 搜索歷史上的任何
<string>,按Ctrl+R- 執行:按下 Enter 鍵。
- 修改:按下 Tab 鍵。
- 從歷史記錄中重新執行一個編號的命令
!<command-number>(命令編號)
在終端機視窗中可以同時運行多個 Shell,它們是相互獨立的,包括每個 Shell 中輸入的命令。
當 Shell 成功退出時,Bash 歷史記錄才會將當前 Shell 中輸入的命令保存在 ~/.bash_history 文件中。如果 Shell 崩潰,那麼該 Shell 中的命令將不會被記錄在歷史記錄中。
請記住,Shell history 是當前 Shell 的內存空間和 ~/.bash_history 文件的功能。
保存的 Shell 命令數量由 HISTSIZE 環境變量設置。在 SUSE 中,此值默認為 1000,但在您自己的環境中可以按需要進行配置。
如果您想输入命令但不想使其成為歷史記錄的一部分,請在其前面加上空格。
對於 SLE 12 中的 root 用戶,歷史記錄的時間戳默認打開(這是一個 Shell 變量設置)。這樣可以查看命令執行的實際日期和時間。每個 Shell 的並發內存空間命令歷史記錄會被 Shell 合併成單一的、按時間排序的歷史記錄文件。
您可以修改和刪除歷史記錄中的單個命令,也可以使用 history -c 命令清除所有命令。有關 Shell 歷史記錄功能的更多信息,請參閱 Bash 手冊頁面(或 Bash 內置幫助命令)。
Tab Auto-Completion
當輸入一個命令時,按 Tab 鍵,Bash 會自動完成你路徑中的命令、目錄或文件名,這些命令、目錄或文件名與你到目前為止已經輸入的內容相匹配,只要它們是非模糊的。如果你輸入的內容是模糊的(與一個以上的命令/目錄/文件相匹配),第二次按 Tab 鍵將顯示所有匹配的命令。
Tab 的自動完成功能對於您在管理 SUSE Linux 系統時輸入長而復雜的命令名和路徑名非常有價值。
其他一些程序,如 YaST (yast / yast2),已被編譯為使用 readline 庫,不僅可以讓您自動完成命令和路徑名稱,還可以為這些命令提供選項。
Escape Characters
為了避免命令列中的某些特殊字元被解釋,我們必須使用下列方法來「遮蔽」這些特殊字元:
反斜線(\)
- 將下一個字元解釋為 ASCII 碼。
- 反斜線可以保護一個字符不被 shell 解釋。
- 例如 :
> mkdir new\ directory > ls -l drwxr-xr-x 2 rancher users 6 Mar 20 11:36 new directory
雙引號("...")
- 將引號內的所有字元解釋為 ASCII 碼,但
$、\、‵三個字元除外。 - 雙引號保護所有的特殊字符,除了
$、\、‵(反勾),不被 shell 解釋。 - 它允許 shell 解釋美元符號 (
$)、反引號 (‵)、反斜杠 (\) 和驚嘆號 (!)。這些字符在與雙引號一起使用時具有特殊含義,並且在顯示之前會對其進行評估。雙引號可以在雙引號內使用,方法是在其前面加上反斜杠。- 例如 :
> echo "HOME=$HOME" HOME=/home/rancher
單引號('...')
- 將引號內的所有字元解釋為 ASCII 碼。
- 也要保護
$、\、‵(反勾),不被 shell 所解釋,使用單引號 - 用單引號 (’) 括起來的字符保留引號內每個字符的字面值。簡而言之,shell 將按字面解釋單引號內的封閉文本,並且不會插入任何內容,包括變量、反引號、某些 \ 轉義符等。單引號中的字符沒有特殊含義。
- 例如 :
> echo 'HOME=$HOME' HOME=$HOME
Variables
Bash 允許導出函數和變數,這意味著它們可用於任何新的子 shell
在 shell 中,一個變數有分為普通的 shell 變數和環境變數兩種。其中環境變數被設定成 export 屬性,因此在所有子程序中都會繼承。
- 使用 env 指令可以列出被 export 屬性開啟的環境變數,
- 使用 set 指令可以列出當前 shell 中的所有變數(和函數)。
在設定變數時,慣例上使用大寫字母,例如 PATH。 如果您設定自己的變數,也應使用大寫字母以增加可讀性。
一些重要的環境變數包括:
PATH:當呼叫程式時,系統會在這些指定的目錄(每個目錄用:分隔)中搜尋程式,所列目錄的順序很重要,因為系統會依序搜尋。HOME:使用者的家目錄。USER:實際使用者的登入名稱。
Variables and Command Substitution
- Bash can also expand variables and the output of commands
- Character :
$or${...}- Description : 引用一個存儲在變量中的值
- Character :
...or$(...)- Description : 執行命令並返回輸出作為另一個命令的輸入
Data Channels

在 Linux(包括 Bash)中對程序的輸入和輸出可以被稱為 “data channels (數據通道)"。
程序接收輸入的數據通道被稱為標準輸入或 “stdin",其 file descriptor number (文件描述符號) 為 0。
程序發送輸出的數據通道被稱為標準輸出或 “stdout",其 file descriptor number (文件描述符) 為 1。
錯誤信息從標準輸出中分離出來,發送到自己的通道,稱為標準錯誤或 “stderr"。它的 file descriptor number (文件描述符編號) 為 2。
Channel Redirection
>- 將 stdout (標準輸出) 重定向到一個文件中
- Example:
ls /etc > /tmp/etc_files.txt
>>- 重定向 stdout (標準輸出),附加到一個文件的最後
2>- 將 stderr (標準錯誤輸出) 重定向到一個文件中
2>>- 重定向 stderr (標準錯誤輸出) ,追加到一個文件中最後
<- 從文件中重定向 stdin (標準輸入)
- Example:
mail geeko < email_body.txt
|- 使用一個命令的 stdout (標準輸出) 作為另一個命令的 stdin (標準輸入)
- 在一個管道中,最多可以存在 4KB 的尚未處理的數據。
- If the process creating the output tries to write to a full pipe, it is stopped and only allowed to continue if the writing process can be completed. On the other side, the reading process is stopped if it tries to read an empty pipe.
- Example:
ls /etc | grep samba
tee- 將 stdout (標準輸出) 重定向到一個文件和終端機的螢幕上
- Example:
<command> | tee <file>
Chain Commands Together
;,Chain multiple commands together on a single command line- Example:
echo Hello ; echo How are you?
- Example:
&&,Execute a second command only if the first command returns no error (return code 0)- Example:
grep "swap" /etc/fstab && echo Success
- Example:
||,Execute a second command if the first command returns an error (i.e. return code other than 0)- Example:
grep "XXX" /etc/fstab || echo Failure
- Example:
Understand some Common CLI Commands
Backup-Oriented Shell Commands
tar-cto create an archive-fto specify the archive file name-vfor displays a more detailed output of the backup process-xto extract an archive-tto list the content of an archive-zto (un-)compress the archive with gzip-jto (un-)compress the archive with bzip- 建立壓縮檔:
tar -czvf 壓縮檔名稱.tgz 來源檔案/目錄(1) 來源檔案/目錄(2) ...來源檔案/目錄(n)
cpio- Another archiving command
gzip- Compress files using the gzip algorithm
-c壓縮檔案而不修改原始檔案。結果寫入標準輸出(通常是螢幕),可以使用”>“將其重新導向到檔案中。-d解壓縮指定的檔案(gunzip)。-1到-9,--fast,--best控制壓縮速度:-1表示--fast,會快速壓縮但會產生較大的檔案,-9對應--best,需要更多的運算時間但會產生較小的檔案。- 預設設置為
-6。
-r,--recursive壓縮和解壓縮所有子目錄中的檔案。
gunzip- Expand files compressed with gzip
bzip2- Compress files using the bzip2 algorithm
-c參數表示壓縮檔案,但不會修改原始檔案。壓縮後的結果會顯示在標準輸出上(通常是螢幕),可以使用>符號將結果重定向到另一個檔案中。-d參數表示解壓縮指定的檔案,對應的是bunzip2。-1到-9控制壓縮速度,-1表示快速壓縮,但產生的檔案較大,-9則需要較多的運算時間,但產生的檔案較小。- 預設值為
-9。
bunzip2- Expand files compressed with bzip
gzip vs. bzip2
- gzip 優點:
- 較快的壓縮和解壓速度,適用於大部分的文本檔案和程式碼文件;
- 占用較少的系統資源和存儲空間,適用於舊的硬體設備和有限的存儲空間。
- bzip2 優點:
- 較高的壓縮比例,能夠壓縮比較大的檔案,節省網路帶寬和存儲空間;
- 能夠處理包含重複模式的文本檔案,有較好的壓縮效果;
- 比 gzip 更好的容錯性,即使某些部分資料被損毀,也能夠保留其他部分資料。
- 總之,gzip 更適用於速度和資源消耗的考量,而 bzip2 更適用於壓縮比例和容錯性的考量。
Special File Copying Commands
rsync- 僅複製兩個目錄之間的 deltas (增量)
- Local or via network
- Uses ssh as default transport
- Can talk to rsync daemon on the remote machine
dd- Copies files block by block
- Used to create disk or partition images
- Most important options:
if=input_fileof=output_filebs=block_size
rsync
-a,選項會將 rsync 設定為存檔模式。- 存檔模式是由不同的其他選項 (即 rlptgoD) 組合而成,可以確保複製的檔案特性與原始檔案完全相同。
- 確保了目錄的複製品中保留以下的內容:
- Symbolic links (
loption) - Access permissions (
poption) - Owners (
ooption) - Group membership (
goption) - Time stamp (
toption)
- Symbolic links (
- 包含了
-r選項,它確保子目錄被遞歸複製。
-x,只備份同一檔案系統中的檔案,也就是說 rsync 不會追蹤到其他檔案系統的符號連結。-v,啟用詳細模式。使用這個模式可以輸出有關傳輸檔案和複製過程進度的資訊。-z,在傳輸過程中壓縮資料。這對於遠端同步非常有用。--delete,從鏡像目錄中刪除原始目錄中不存在的檔案。--exclude-from,不備份在排除清單中的檔案。
最後一個選項的使用方法如下:
rsync -a --exclude-from=/home/exclude /home/. /shadow/home在這個例子中,所有列在 /home/exclude 中的文件都不會被備份。空行或以 “;“或 “#“開頭的行被忽略。
使用 rsync 和 ssh,你可以通過網絡登錄到其他系統並遠程執行數據同步。 例如,下面的命令將 tux 用戶的主目錄複製到一個備份服務器上:
rsync -ave ssh root@da1:/home/tux /backup/home/在這個例子中,-e 選項指定了傳輸時應該使用的遠程 shell(ssh)。
來源目錄由表達式 root@da1:/home/tux 指定。這意味著 rsync 應該以 root 身份登錄到 da1 並傳輸 /home/tux 目錄。
由於 rsync 使用的默認 shell 是 ssh,只有當你想使用 ssh 以外的東西時才需要使用 -e 選項。
當然,這也適用於其他方向。在下面的例子中,主目錄的備份被複製回到 da1 系統中:
rsync -ave ssh /backup/home/tux root@da1:/home/注意:rsync 必須同時安裝在源計算機和目標計算機上才能工作。
另一種用 rsync 進行遠程同步的方法是採用 rsync 服務器。這允許你在不允許 SSH 登錄的情況下使用遠程同步。
參考文章 : Linux 使用 rsync 遠端檔案同步與備份工具教學與範例
dd
You can use dd to create a backup copy of the MBR (master boot record) and the partition table. For example:
dd if=/dev/sda of=/tmp/mbr_copy bs=512 count=1count=N,只處理 N 個輸入區塊
Search for Files
find,Search for files or directorieswhereis,試圖在 Linux 的標準位置以及$PATH和$MANPATH指定的位置上找到所需的程序。- Options:
-b, binaries (命令的二進位執行檔)-m,manual pages (說明文件)-s,source code (原始程式碼)-l,顯示所使用的有效搜尋路徑清單
which,搜索$PATH變數中的所有路徑,並返回命令的完整路徑type,Shows the kind of command, e.g.:- shell built-in
- external command
- alias
- function
Use the find Command
要在命令列上搜尋檔案,
可以使用「find」指令。
以下是「find」指令的語法
find path(路徑) Criterion(搜尋條件) [action (動作選項)]「find」指令有很多選項,這裡介紹其中幾個。以下是可以和指令一起使用的選項:
path(搜尋路徑)- 要搜尋的檔案系統範圍,也就是指定要搜尋的資料夾及其所有子資料夾。
- 如果沒有特別指定,預設會從現在所在的資料夾往下搜尋。
Criterion(搜尋條件)- 要找的檔案要具備的屬性(詳細請見下方)
action(動作選項)- 可以影響搜尋條件或整個搜尋過程的控制。
搜尋條件說明:
ctime [+/-]days- 搜索最後一次更改發生在不晚於(不早於)指定天數的檔案。
gid number- 搜尋擁有同樣群組 ID 的檔案。
group name- 透過群組的名稱搜尋檔案,也可以允許用 GID 搜尋
name pattern- 搜尋檔案名稱符合指定模式的檔案。如果模式裡有特殊符號,檔名必須加上引號。否則,該名稱將由 shell 解釋,而不是由 find 解釋。
newer file- 搜尋比指定檔案更新的檔案。
size [+/-]size- 搜尋符合指定大小的檔案。大小以 512 位元組為單位,可以用「c」表示位元組、用「k」表示 1024 位元組。
- 加號「+」表示搜尋比指定大小大的檔案,減號「-」表示搜尋比指定大小小的檔案。
type file_type:搜尋指定類型的檔案。d(資料夾)f(一般檔案)l(符號連結)。
uid 數字:搜尋擁有同樣 UID 的檔案。user 名稱:搜尋擁有同樣使用者名稱的檔案,也可以允許用 UID 搜尋
最重要的 action 是:
print(默認)- 執行命令
使用 -exec 選項,你可以調用另一個命令。這個選項經常被用來連接 find 和 grep,如下所示
> find ~ -name "letter*" -type f -exec grep appointment {}. \;螢幕輸出 :
appointment for next meeting: 23.08.
/home/geeko/letters/letter_Smithfind命令搜索名字以letter開頭的文件,然後將找到的文件名用-exec傳遞給下面的命令(本例中是grep appointment {})。- 兩個大括號”{}“作為佔位符,找到表示符合條件的檔案,並傳遞給 grep 命令。
- 分號(
;)結束了-exec指令。因為這是一個特殊的字符,所以要在它前面加一個反斜杠(\)來掩蓋它。
Search File Content (1 of 2)
Syntax:
grep [options] search_pattern filenameRegEx:
^,該行的開頭$,行末\< \/>,字的開頭和結尾[abc],集合中的任何一個字元[0-9],指定範圍內的任何一個數字[^xyz],集合中沒有的任何字元.,匹配任意單個字符+,One or more of the preceding expression*,任何数量的前面的单字符{min,max},前面的表達式最少 min 次,最多 max 次|,比對任一種字串(...),Enclose alternatives for grouping others?,Zero or more of the preceding\,Any one from the specified range
Understand vim
- Command Mode
- Default mode of VIM
- Every keystroke is interpreted as a command
- Insert Mode
- To enter/edit text
- To enter, from Command mode, press:
i (insert), a (append) or o (open new line)
- Command Line Mode
- To enter Command mode press:
<escape>:
- To enter Command mode press:
Command Mode Cursor Keystrokes
- k 或 UpArrow - 將光標向上移動一行
- j 或 DownArrow - 將光標向下移動一行
- h 或 LeftArrow - 將光標左移一個字符
- l 或 RightArrow - 將光標右移一個字符