Ict-創新/LPI/105.1
候選人應該能夠自定義 Shell 環境以滿足使用者的需求。候選人應該能夠修改全域性和使用者配置檔案。
關鍵知識領域
- 在登入或啟動新 Shell 時設定環境變數(例如 PATH)。
- 為常用的命令序列編寫 BASH 函式。
- 維護新使用者帳戶的骨架目錄。
- 使用正確的目錄設定命令搜尋路徑。
命令列介面 (CLI 或終端) 乍一看可能令人望而生畏,但重要的是要記住,命令列實際上是你的朋友。有大量的工具可供你使用,這些工具可以將原本需要花費大量時間才能完成的任務(例如從長檔案中的每一行刪除最後四個字元)變成兩分鐘就能完成的工作。
對於每個 Linux 發行版,命令列提示符看起來都會略有不同。例如,在一個系統上,你可能會看到你的使用者名稱、'@' 符號、機器名、當前目錄以及提示符。
user@linux ~/$
這是一個非常常見的提示符。你也可以看到你的使用者名稱、一個空格、計算機的完全限定域名、當前工作目錄的完整路徑,最後是提示符。
user linux.box.com /home/user$
提示符因系統而異,這取決於許多因素。例如,它可能是由特定 Linux 發行版的建立者設定的預設配置。它也可能由管理計算機的人或你自己配置。
配置命令提示符的外觀的方式取決於你使用的 Shell,而 Shell 是大多數人通常所說的“命令列”,而實際上,它只是一個提供核心服務的介面的軟體。Shell 與“命令列”之間的區別僅僅是 Shell 指的是提供命令列介面的特定軟體(例如 BASH、tcsh、ksh 等)。大多數現代 Linux 系統使用 BASH(Bourne Again SHell)作為其預設 Shell。
一點歷史
命令列中使用的命令可能看起來有些神秘,因為它們往往非常短。這是因為 Linux 命令列的根源來自那些系統,在這些系統中,單個字母的輸入需要相當長的時間才能從終端傳輸到中央伺服器,再返回到終端並在紙捲上打印出來。在那些舊的系統中,輸入越短越好,因為這意味著等待發出命令和接收輸出的時間更少。記住命令代表什麼的最有效方法是找出該命令是哪個詞的縮寫。這對於以後記住命令很有幫助。
- ls - 此命令“列出”當前工作目錄的內容。
- pwd - 顯示當前工作目錄。
- cd - 允許你更改目錄。
- rm - 刪除一個或多個檔案。
- rmdir- 刪除空目錄。
- mkdir - 建立目錄。
- ps - 提供當前正在執行的程序列表。
- cp - 複製檔案。
- mv - 移動檔案(這也被用來重新命名檔案,將檔案從一個檔名“移動”到另一個檔名)。
- grep - 全域性正則表示式列印程式允許你搜索檔案或其他程式的輸出。
- find - 在檔案系統中查詢檔案。
- man - 顯示大多數命令的手冊(包括 'man')。
提示
有關命令的幫助資訊,請使用 man command ,這將顯示其手冊。請注意,某些命令是內置於 Shell 中的,沒有 man 頁面,請使用直譯器內部命令(應該是 help <command>)。
登入 Shell 與非登入 Shell
登入 Shell: 使用登入、bash -l 或 su 命令啟動的 Shell。
非登入 Shell: 以任何其他方式啟動的 Shell。
兩種 Shell 型別的原因
登入 Shell 在啟動時會讀取一系列配置檔案。
非登入 Shell 從啟動它的父程式繼承設定(環境變數)。
變數繼承
在 Shell 內宣告的變數如果被匯出,則會被子程序繼承。
如果子程序更改了它自己匯出的變數的副本,則父 Shell 的副本不會被更改。更改後的值會匯出到任何子子程序。
所有匯出的 Shell 變數在子程序中保留其匯出設定。
如果從 Shell 內呼叫 Shell 指令碼,則會啟動一個新的子非登入 Shell。
如果使用 Shell 內的 '.' 命令啟動 Shell 指令碼,則該指令碼將在當前 Shell 內執行。
示例: /home/joe/bin/myscript
警告: 如果呼叫的指令碼執行 exit 命令,則當前 Shell 將被終止!
互動式 Shell 與非互動式 Shell
互動式 Shell: 提供一個提示符,使用者可以在其中鍵入命令。
非互動式 Shell: 沒有 Shell 提示符 - 透過呼叫 Shell 指令碼或使用命令啟動
sh -c 'command...'
bash 啟動時的事件序列
互動式登入 bash
bash --login 或 su - username 或從登入
/etc/profile 首先從互動式登入 Shell 中執行。它包含系統範圍的環境設定。
~/.bash_profile 單個使用者的 Shell 設定。
~/.bash_login 如果 ~/.bash_profile 不存在,則執行。
~/.profile 如果 ~/.bash_login 或 ~/.bash_profile 不存在,則執行。
互動式非登入 bash
su username 或 bash -c command
~/.bashrc 啟動時執行的唯一指令碼。從父 bash 環境繼承。
非互動式非登入 bash(在指令碼執行時被 fork)
上述指令碼不會被執行,而是從其父級繼承環境。
BASH_ENV 讀取變數 BASH_ENV 中的檔案。
ENV 如果 BASH_ENV 不存在,則讀取變數 ENV 中的檔案。
額外檔案
/etc/inputrc - 系統 bash 行編輯(readline)配置檔案
~/.inputrc - 個人 bash 行編輯(readline)配置檔案
~/.bash_logout - 登入 Shell 退出時執行(如果存在)。
Shell/環境變數的命令
Variablename=Value - 為已設定(現有)或未設定的變數分配值。
export Variablename 或
declare -x Variablename - 為現有 Shell 變數設定匯出標記 ON。
export Variablename=value 或
declare -x Variablename=value - 為已設定(現有)或未設定的變數分配值,並將其匯出標記設定為 ON,所有操作都在一個命令中完成。
env - 顯示所有環境變數(匯出標記為 ON)
export - 與 env 命令相同,但顯示格式不同,例如 declare -x PAGER="less"
別名通常用於建立命令快捷方式(簡稱)。
別名不可匯出:不會傳遞給子 Shell 或子程序。
別名在指令碼中不被識別。
一個別名可以在命令中呼叫另一個別名。
示例別名 li="ls -l"; 別名 al="li -a" al 呼叫別名 'li'
新增到別名的引數將新增到實際命令的末尾。
引數變數($1、$2、$3 ... 等等)不能在別名中使用。
別名通常在用點 '.' 命令執行的指令碼(例如 ~/.bashrc 或 ~/.profile)中定義。
別名命令
alias - 顯示當前 Shell 的所有別名。
alias AliasName="command(s)..." - 設定新的別名值。
示例:
|
# alias cp="cp -i" |
將原始命令 cp 替換為 cp -i,用於互動式複製(在覆蓋檔案之前詢問)。
unalias AliasName - 取消設定(刪除)別名。
它們通常用作 Shell 中的快速本地迷你指令碼,這些指令碼需要在互動式 Shell 或指令碼中多次呼叫。
變數可以傳遞給函式,並將被識別為 $1 $2 $3 等等。事實上,以下變數在函式內是區域性的。
$1 - $9 - 位置引數
$# - 位置引數的數量
$* "$1 $2 $3 …"
$@ "$1" "$2" "$3" ...
位置引數 $0 和所有其他變數在 Shell 中保持全域性,除非在函式中給出 local Variablename 命令。在函式中,變數 FUNCNAME 用於代替 $0。
全域性 Shell 或匯出的變數可以在函式中更改。
函式不會返回變數,除了返回值,例如 Return 5。return 命令也會立即終止函式。返回值可以使用 $? 讀取為普通退出值。
在指令碼中,函式通常包含在頂部,以便先讀取它們。
環境函式可以放入一個檔案中,並使用 . 命令讀取。
函式可以是遞迴的。對遞迴呼叫的次數沒有限制。
函式可以使用以下命令匯出:export -f FunctionName
函式語法
FunctionName ()
{
command1 ;
command2 ;
}
命令搜尋優先順序
當執行命令時,bash 會按以下順序嘗試查詢命令。
別名
函式
內建命令
搜尋 PATH
找到的第一個命令就是執行的命令。
為了強制使用內建命令而不是別名或函式(如果存在與別名或函式相同的命令名稱),請使用命令 builtin。
|
# builtin cat /etc/fstab |
語法:set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
set 命令用於
-顯示所有 bash 變數及其值以及函式。
示例
set [bash 操作屬性](使用選項)。
-為位置引數賦值
示例
|
# set aaa bbb ccc ($1 $2 $3) |
以上將值 aaa 賦予 $1,bbb 賦予 $2,ccc 賦予 $3。
unset
語法:unset [-fv] [name ...]
對於每個 name,刪除相應的變數或函式。
每個 unset 變數或函式將從傳遞給後續命令的環境中刪除。如果任何 RANDOM、SECONDS、LINENO、HISTCMD、FUNCNAME、GROUPS、DIRSTACK 被 unset,它們將失去其特殊屬性,即使它們隨後被重置。如果 name 不存在或為只讀,則退出狀態為真。
如果沒有提供選項,或者提供了 -v 選項,則 name 指的是 shell 變數。只讀變數不能被 unset。
|
# unset -v # unset -f |
以下示例分別刪除變數 DISPLAY 和函式 startx。
|
# unset DISPLAY # unset -f startx |
以下是使用的檔案、術語和實用程式的部分列表。* /etc/profile
- env
- export
- set
- unset
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
- ~/.bashrc
- ~/.bash_logout
- function
- alias
- 列表