Linux系統學習筆記:shell環境

來源:互聯網
上載者:User

Linux系統學習筆記:shell環境 Linux系統中包含強大的shell環境,作為命令直譯器。通過shell環境不僅可以和大量的命令列工具進行互動,而且shell還支援指令碼編程,以批處理的方式完成更為複雜耗時的工作。BASH是目前絕大多數Linux版本的預設shell解譯器。本篇我們以BASH為基礎總結shell環境。 在文本介面或者圖形介面的終端類比視窗中,shell作為命令直譯器運行,稱為shell環境。有多個版本的shell,通常BASH用的較多。 BASH通過 /etc/profile 檔案進行全域配置。登入時,會尋找並執行 ~/.bash_profile 、 ~/.bash_login、 ~/.profile ,登出時執行 ~/.bash_logout 。非登入還會執行 /etc/bashrc 和 ~/.bashrc 檔案。非互動的BASH不執行這些初始設定檔案中的命令,只繼承它們設定的變數,並且執行 BASH_ENV 環境變數指定的檔案中的命令。 一般需要修改預設的環境變數時,在profile檔案( ~/.bash_profile 、 ~/.profile 、 /etc/profile )中修改。而命令如命令別名在rc檔案( ~/.bashrc 、 /etc/bash.bashrc )中修改。 shell命令在鍵入斷行符號之後執行,在此之前可以修改。 下面是shell環境中一些鍵的作用: Backspace  Delete  ^H 刪除字元^W 刪除單詞^U 刪除行^C 中斷^Z 掛起^D 退出目前使用者登入shell中輸入的命令的文法是: cmd [arg] ... [arg]通常開始為命令名,後面接可選的參數。以 - 或 -- 開頭的參數也稱為選項,一般放在普通的參數之前,由命令解釋, - 開頭的選項通常可以合并。可以使用 -- 來表示後面的參數不解釋為選項。 shell在 PATH 環境變數指定的路徑下尋找使用者擁有執行許可權的程式。 shell中的特殊字元包括: `  !  #  $  %  ^  &  *  +  ~  \  |  ;  '  "  /  ?  <  >  (  )  [  ]  {  }在特殊字元前加上 \ 可以對特殊字元進行轉義,也可以通過使用單引號將它們括起來。輸入控制字元可以先按 ^V 。 ; 號可以分隔多條命令,但不立即執行它們。對於單條命令過長時,可以使用 \ 換到下一行繼續輸入。 ()可以對命令分組,shell為每組命令建立一個子shell,把它們作為一個作業。 # 開始行注釋。 && 和 || 為邏輯與和邏輯或,串連命令可以做短路判斷。 ! 反轉命令的退出狀態值。 此外, . 在行首時執行命令。 重新導向一個程式的進程會開啟3個檔案描述符,分別是標準輸入(0)、標準輸出(1)和標準錯誤輸出(2)。一般情況下,標準輸入是鍵盤,標準輸出和標準錯誤輸出是shell輸出,可以通過重新導向來改變標準輸入輸出的關聯。 < 重新導向標準輸入( 0< 的簡寫), > 重新導向標準輸出( 1> 的簡寫), 2> 重新導向標準錯誤輸出, >> 將標準輸出追加到檔案, << 將指令碼的內容重新導向為指令碼的輸入。 << 重新導向的內容稱為Here文檔,使用一個或多個符號來界定,開頭的界定符必須緊挨 << ,結尾的界定符必須獨佔一行。 重新導向會覆蓋已有檔案,可以設定 noclobber 來禁止重新導向時重寫,而 >| 則可以忽略 noclobber 設定。 /dev/null 稱為位桶,可以將標準輸出重新導向到 /dev/null 來拋棄輸出的內容。 $ set -o noclobber$ date --rfc-3339=seconds > d.txt$ cat d.txt2012-03-08 16:55:46+08:00$ date --rfc-3339=seconds > d.txt-bash: d.txt: cannot overwrite existing file$ date --rfc-3339=seconds >| d.txt$ cat d.txt2012-03-08 16:56:00+08:00$ set +o noclobber$ date --rfc-3339=seconds > d.txt$ cat d.txt2012-03-08 16:56:31+08:00$ date --rfc-3339=seconds >> d.txt$ cat d.txt2012-03-08 16:56:31+08:002012-03-08 16:57:14+08:00$ cat /dev/null > d.txt    # 刪除檔案內容$ grep -i alex <<+> Alex> Harry> Nancy> +Alex可以用 &n 代替重新導向到的檔案名稱, n 為檔案描述符。重新導向到 &- 表示關閉該描述符。 $ cat afile a$ cat bcat: b: No such file or directory$ cat a b > out          # 重新導向標準輸出到outcat: b: No such file or directory$ cat outfile a$ cat a b 1> out 2>&1    # 重新導向標準輸出到out,重新導向標準錯誤輸出到標準輸出(即out)$ cat outfile acat: b: No such file or directory$ cat a b 2>&1 1> out    # 重新導向標準錯誤輸出到標準輸出,重新導向標準輸出到outcat: b: No such file or directory$ cat outfile a管道shell環境下的管道可以將前一個命令的輸出作為後一個命令的輸入,管道實際上並不單獨處理每條命令,而且不產生中間檔案。文法為: cmd [args] | cmd [args]管道可以串聯,也可以和重新導向組合使用。 $ who | tee w.out | grep yeolar    # 還產生了包含全部登入使用者的w.out檔案yeolar   pts/2        2012-03-08 16:13 (yeolar-pc.local)tee 命令可以將標準輸入複製到標準輸出和檔案。 後台運行命令預設在前台運行,在命令執行完畢後將控制權交回shell。可以讓命令在後台運行,這樣可以不必等待命令執行完畢。命令或管道串連的命令序列稱為作業,可以有多個作業在後台運行。同一時間運行多個作業稱為多任務特性。 在命令列末尾加上 & 可以使作業在後台運行。shell會給作業分配一個作業編號。 jobs 顯示作業的列表。使用 fg 命令(或 % )可以將後台作業移到前台,使用 bg 命令可以將掛起的作業移到後台運行。 $ cat &                       # 後台運行cat,作業號1,PID 2640;掛起sleep,作業號2[1] 2640$ sleep 10^Z[1]-  Stopped                 cat [2]+  Stopped                 sleep 10$ date --rfc-3339=s2012-03-09 09:07:17+08:00$ date --rfc-3339=s           # 等待超過10s2012-03-09 09:07:32+08:00$ bg                          # sleep作業仍在,移到後台並運行[2]+ sleep 10 &$ jobs                        # 顯示作業列表,sleep因為逾時而結束[1]+  Stopped                 cat[2]-  Done                    sleep 10$ %1                          # 將作業1移到前台;掛起cat,作業號1cat^Z[1]+  Stopped                 cat$ bg 1                        # 將作業1移到後台[1]+ cat &$ jobs                        # 顯示作業列表[1]+  Stopped                 cat$ fg                          # 將作業1移到前台;中斷catcat^C目錄棧dirs 命令顯示目錄棧, pushd 改變目錄,並將目錄壓入目錄棧,不加參數時交換棧頂的兩個目錄, popd將目錄從棧中彈出,不加參數時彈出棧頂目錄,並改變到該目錄。 $ mkdir -p a/b/c$ dirs~$ pushd a/~/a ~$ pushd b/c/           # pwd:~/a~/a/b/c ~/a ~$ pushd                # pwd:~/a/b/c~/a ~/a/b/c ~$ pushd b/             # pwd:~/a~/a/b ~/a ~/a/b/c ~$ pushd +1             # pwd:~/a/b~/a ~/a/b/c ~ ~/a/b$ popd +1              # pwd:~/a~/a ~ ~/a/b$ popd                 # pwd:~/a~ ~/a/b$ popd +1~命令曆史HISTSIZE 、 HISTFILE 和 HISTFILESIZE 可以設定命令曆史的儲存數量和檔案。 fc 命令可以查看( -l )、編輯(無參數或 -e )、重新執行( -s )命令。 還可以用 ! 引用事件(即命令): !! 執行前一個命令!n 執行曆史列表編號為n的命令,n為負值時,執行最近第|n|條命令!str 執行最近以str開頭的命令!?str[?] 執行最近包含str的命令,後面的?是可選的!# 當前命令已經輸入的部分!{event} {}將event和左右文本隔開命令可以使用字標誌符和修飾符進行一些修改和替換等。 Readline庫BASH的命令列編輯是通過Readline庫實現的。有vi和emacs兩種編輯模式可選。命令列的諸如命令列補全和一些快速鍵功能都是源於Readline庫。 別名BASH的另一個很方便的功能是別名,通過 alias 將命令簡化。 alias 可以嵌套。一般會在BASH的rc設定檔中配置它。 $ aliasalias ls='ls --color=auto'$ alias ll='ls -l'擴充{}擴充{} 中以 , 分隔開的字串會擴充成以空格符分開的字串列表, {} 兩端可以有可選的首碼和尾碼,它們被加到字串列表中每個字串的兩端。 $ touch a{1,2,3,4,5}.txt$ lsa1.txt  a2.txt  a3.txt  a4.txt  a5.txt~擴充~ 代替 HOME 變數的值。如果 ~ 後面跟一個合法的使用者名稱,那就會替換為該使用者的主目錄。在目錄棧中, ~+為當前工作目錄, ~- 為前一個工作目錄。 $ echo ~root/root算術擴充$((expr)) 會計算 expr 並用結果替代它。BASH中使用整數進行計算。在 $(()) 中變數的引用符 $ 可以省略。 let 命令也計算算術運算式的值,而且可以給它傳遞多個參數。 $ x=3 y=7; echo $(((x+y)/2))5$ let m=(x+y)/2 n=(x+y)/m; echo $m $n5 2命令替換命令替換的文法有兩種: $(cmd) 和 `cmd` ,它們用命令的輸出替代該命令。 $ ls -l $(find . -name README -print)路徑擴充對於包含特殊字元的檔案名稱,shell可以產生和已有檔案的名字匹配的檔案名稱,這稱為路徑擴充或通配,特殊字元稱為萬用字元。 ? 匹配單個字元, * 匹配0或多個字元, [] 匹配方括弧中的任意一個字元,可以用 - 指定字元範圍,還可以在字元列表前用 ! 或 ^ 表示不匹配任意一個字元。 $ touch a111 a1 a2 a3 a5 b2 b3 c5$ echo *a1 a111 a2 a3 a5 b2 b3 c5$ echo .*. ..$ echo a*a1 a111 a2 a3 a5$ echo a?a1 a2 a3 a5$ echo a[1-3]a1 a2 a3$ echo a[!1-3]a5$ echo a[^1-3]a5$ echo [a-z]*a1 a111 a2 a3 a5 b2 b3 c5$ echo [a-z]?a1 a2 a3 a5 b2 b3 c5變數shell變數以字母(包括 _ )和數字組成,以字母開頭。全域變數又稱環境變數,通常採用大寫形式。使用= 號建立變數, = 兩邊沒有空格。變數值預設以字串形式儲存。在變數名前加上 $ 來引用變數,可以在變數名兩邊加上 {} 來消除歧義。 指派陳述式 = 右側為空白可以將值置空, unset 命令刪除變數。 單引號和雙引號將內容解釋為字串,單引號會阻止引用。 $ fa=a*$ echo fafa$ echo $faa1 a2 a3$ echo ${fa}aa*a$ echo "$fa"a*$ echo '$fa'$fa可以使用 declare 或 typeset 設定變數屬性,有以下選項: -a 聲明陣列變數-f 聲明函數變數-i 聲明整型變數-r 聲明唯讀變數,等價於  readonly-x 輸出變數(設定為全域變數),等價於  export如果將選項的前置 - 改為 + ,可以刪除特定屬性。不帶參數時,列出所有特定類或全部的變數。 關鍵字變數HOME 變數儲存使用者主目錄, ~ 會被shell展開為 HOME 值。 PATH 指定了shell的搜尋路徑,搜尋路徑由 : 分隔的一組路徑組成。 export PATH 會使其可被子shell訪問。 $ export PATH=$PATH:$HOME:    # 中間的:也可省略CDPATH 和 PATH 文法類似,它擴充了 cd 命令可進入目錄的範圍。 PS1 設定使用者主提示符, PS2 設定使用者次提示符,預設為 > , PS3 設定 select 控制結構的菜單提示符,PS4 設定BASH調試提示符。 IFS 設定分詞的分隔字元,預設為空白符,通常不需要對其進行修改。 更多的關鍵字變數可以參考 man bash 手冊。 函數函數也是一種變數,建立函數的文法為: [function ]name (){    command}函數將一組命令放在一起,方便了調用。函數名和命令一樣,執行函數只需執行函數名即可。 可以把常用的函數放在BASH的profile檔案中。 shell特性可以使用 set -o 和 set +o 開啟和關閉shell的特性。BASH的特性參看 man bash 。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.