Linux回顧【2】shell
阿新 • • 發佈:2022-04-10
依次執行一系列命令
- 命令列表
pwd; ls; cd ..; pwd
將一組命令組合在一起依次執行。 - 程序列表
(pwd; ls; cd ..; pwd)
會生成一個子shell來執行括號中的命令組合。 - 如果不想建立子shell,又想將多個命令分組,使用花括號
{pwd; ls; cd ..; pwd}
.
特殊變數 $BASH_SUBSHELL
- 用於顯示是否是子shell
(pwd ; (echo $ZSH_SUBSHELL))
. - 對於指令碼,常用子shell進行多程序處理;但對於互動式CLI,無法進行真正的多程序處理,因為終端控制了子shell的I/O。
在互動式命令列中的子shell用法
1. 使用與符號& (ampersand)讓命令進入後臺執行
-
sleep 5 &
返回後臺作業號和程序號 [background job id] PID[1] 33711
.jobs
- 顯示所有後臺程序
-
-l
增加顯示後臺程序的PID
2. 使用與符號和列表將子shell放到後臺執行
-
(sleep 2; echo $ZSH_SUBSHELL; sleep 2) &
此命令立即返回[1] 33760
,等待2秒,顯示➜ ~ 1
,再過2秒, 顯示[1] + 33760 done ( sleep 2; echo $ZSH_SUBSHELL; sleep 2; )
- 再次過程中可以一直輸入其他命令,且子shell的I/O也不會受制於終端輸入。
3. coproc 協程
- 在後臺生成子shell,並在其中執行命令。
-
coproc sleep 2
和sleep 2 &
等效.
shell的內建命令和外部命令
區分
type -a cmd
- 有些命令既有外部也有內建實現。
外部命令
- 其存在於shell程式之外,執行時會創建出(fork)一個子程序
內建命令
- 不需要shell以外的檔案執行,不需要子程序來執行。
-
history
顯示最近用過的命令列表,歷史記錄存放於 .bash_history中,儲存數量由 HISTSIZE環境變數控制,history -a
-
alias -p
檢視當前所有命令別名;alias li = 'ls -li'
建立新的別稱,但僅在其所被定義的shell程序中才有效。
環境變數
1. 顯示環境變數
-
env
或者printenv
命令檢視全域性環境變數;set
顯示所有環境變數(全域性、區域性、使用者自定義)。 - 顯示某個環境變數:
env HOME
或者echo $HOME
。
2. 自定義環境變數
- 所有系統環境變數名均用大寫字母,所有自定義環境變數名均用小寫字母
- 建立區域性自定義環境變數:
abc=2
,abc=Hello
,但當包含空格時,必須用引號:abc="Hello World"
- 等號兩側不能包含空格
- 建立全域性自定義環境變數:
abc="Hello World"
,export abc
. - 刪除環境變數
unset abc
.
3. PATH 環境變數
- PATH 變數定義了用於進行命令和程式查詢的目錄,所有在shell中輸入的外部命令必須能在PATH中找到才能執行。
- PATH 中的各個目錄用冒號
:
分隔,在新增搜尋路徑時,需要先引用現有的PATH的值,再在其後新增新的目錄:PATH=$PATH:/abc/efg
.
4. 環境變數與shell
- 互動式shell:只會檢查
~/.bashrc
檔案,此檔案會檢查/etc/bashrc
檔案,並提供使用者自定義變數的空間。 - 非互動式shell (指令碼):
echo $BASH_ENV
,shell指令碼啟動時,會檢查此變數;如果未設定此變數,則繼承父shell匯出的變數。
5. 陣列變數
-
array=(one two three)
. -
echo ${array[1]}
,echo ${array[*]}