1. 程式人生 > 其它 >Linux回顧【2】shell

Linux回顧【2】shell

依次執行一系列命令

  • 命令列表 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 2sleep 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[*]}