1. 程式人生 > >8.1-8.9 預習筆記

8.1-8.9 預習筆記

1.  shell介紹

建立一個普通使用者,預設的shell為/bin/bash/.

  • shell的含義:

首先shell的英文含義是“殼”;它是相對於核心來說的,因為它是建立在核心的基礎上,面向於使用者的一種表現形式,比如我們看到一個球,見到的是它的殼,而非核。Linux中的shell,是指一個面向使用者的命令介面,表現形式就是一個可以由使用者錄入的介面,這個介面也可以反饋執行資訊;

  • shell在Linux中的存在形式

由於Linux不同於Windows,Linux是核心與介面分離的,它可以脫離圖形介面而單獨執行,同樣也可以在核心的基礎上執行圖形化的桌面。這樣,在Linux系統中,就出現了兩種shell表現形式,一種是在無

圖形介面下的終端執行環境下的shell,另一種是桌面上執行的類似Windows 的MS-DOS執行視窗,前者我們一般習慣性地簡稱為終端,後者一般直接稱為shell

  • shell如何執行使用者的指令

shell有兩種執行指令的方式,第一種方法是使用者事先編寫一個sh指令碼檔案,內含shell指令碼,而後使用shell程式執行該指令碼,這種方式,我們習慣稱為shell程式設計

第二種形式,則是使用者直接在shell介面上執行shell命令,由於shell介面的關係,大家都習慣一行行的書寫,很少寫出成套的程式來一起執行,所以也稱命令列。

2. 命令歷史

  • 命令# history可以檢視,已寫入的命令歷史;同時我們也可以用向上的方向鍵檢視命令歷史。

這些命令歷史存放在使用者家目錄下/.bash_history,最大可存1000條命令,並由系統內部配置的環境變數HISTSIZE配置,用echo $HISTSIZE檢視可以看到數字為1000。有時我們可以發現變數超過1000,是因為命令暫時存在記憶體中,並未寫入/.bash_history中,只有在退出終端時,命令才會被儲存到/.bash_history中

  • # history -c,可以清楚記憶體中的命令歷史,但不能清楚/.bash_history配置檔案中的命令歷史
  • 我們也可以改變上文所提到的環境變數HISTSIZE。

首先編輯配置檔案# vi /etc/profile,用/ HISTSIZE,找到相關行,然後把1000數字改為自己想要的數字,例如5000。改好後,需要重新進入終端或使用命令# source /etc/profile來使設定的變數生效,如下圖所示

  • 跟命令歷史相關的還有一個環境變數為HISTTIMEFORMAT,設定這個環境變數可以顯示出命令的時間

具體操作如下圖所示

若想永久儲存HISTTIMEFORMAT設定,可以編輯/etc/profile配置檔案,如下圖所示,之後再# source /etc/profile即可

 

  • 如果想要永久儲存/.bash_history下的命令歷史,我們可以用命令# chatter +a /.bash_history,給檔案加隱藏許可權a許可權,那麼即使HISTSIZE變數設定為1000,命令歷史也只能追加不能刪除了。

注:如果沒有正常退出終端,那麼命令歷史便不能完整儲存

 

  • # !!,可以顯示history中最後一條命令
  • # in(數字),可以執行history中指定條數的命令,例如如下圖所示,想要執行命令歷史中第761條命令,我們就可以寫# !761,就是執行了761條# du -sh amingliux.tar.xz.
  • # !word, 可以執行命令歷史中以指定word開頭的最新的那條命令

3.命令補全和別名

介紹和命令相關的特性

  • 按tab鍵,可以補全命令或者檔案路徑

當遇到開頭一樣,只有一個命令或檔案時,則按一次tab鍵即可

如果開頭一樣的命令或檔案有多個時,則需要按兩次tab鍵

注:與centOS6不同7可以支援補全引數,預設是不支援的需要安裝# yum install -y bash-completion,然後重啟終端

  • 別名alias,會用於給較長且複雜的命令設定別名,來提高效率

語法# alias 原名='別名'

別名儲存在使用者家目錄下/.bashrc或者配置檔案/etc/profile.d/中,且自定義的別名存在/.bashrc下

如果想要撤銷別名使用# unalias 別名,即可

4. 萬用字元

  • 萬用字元

  如下圖所示,ls *.txt可以列出當前目錄下所有,以.txt結尾的檔案,而ls ?.txt, 只能列出txt前字元為一個的檔案

*可以放到任意位置

 

因為?只匹配一個字元,所以如上圖ls ?.txt則不會列出bb.txt檔案

  • 【】

 

5.輸入輸出重定向

0 表示stdin標準輸入;

1 表示stdout標準輸出;

2 表示stderr標準錯誤。

  • 輸出重定向 --- >表示覆蓋原檔案內容,>>表示追加內容。兩個命令都是如果檔案不存在則建立檔案

例如

# cat 1.txt > 2.txt, 此命令會使1.txt的內容重寫到2.txt中,且2.txt中原有的內容不儲存

# cat 1.txt >> 2.txt,與> 不同,此命令會吧1.txt的內容追加至2.txt中,且2.txt中原有的檔案內容仍在

  • 2> & 2>>錯誤重定向&追加重定向, 可以把錯誤命令的資訊重寫或追加到指定的檔案中去,如下圖所示,不存在命令lsaaa, 顯示錯誤資訊,用2> 和2>>就可以把錯誤資訊重寫或追加到a.txt.

# lsaaa 2> a.txt; # lsaaa 2>> a.txt

  • &> ; &>>, 可以把正確的輸出和錯誤的輸出同時定向到指定檔案

如下圖所示,ls [12].txt 為正確的輸入,而aaa.txt不存在則ls aaa.txt便為錯誤,我們可以ls [12].txt aaa.txt &> a.txt; ls [12].txt aaa.txt &>> a.txt, 在cat a.txt可以發現正確的輸出和錯誤的輸出都被寫入到了a.txt中

  • 上條介紹瞭如何把正確和錯誤的輸出定向到同一個檔案中,我們也可以把正確和錯誤分開分別定向到各自的檔案中去

仍然使用上面的例子,ls [12].txt aaa.txt > 1.txt 2> a.txt, 用cat分別檢視1.txt和a.txt,可以發現正確和錯誤的輸出被分別寫入到了1.txt和a.txt

如下圖所示

  • 命令 >> 檔案 2>&1 :以追加的方式,把正確輸出和錯誤輸出都儲存在檔案中。
  • 輸入重定向 —— <

可以把<右面的檔案作為<左面命令的輸入,例如# wc -l < 1.txt, 就是1.txt檔案內容作為命令# wc -l的輸入,如下圖所示

注:不可以如下圖所示那樣使用

6.管道符和作業控制

1)管道符

把前面輸出的內容傳給後面的命令。

例如下圖所示,# find ./ -type f |wc -l,則表示把查詢出的當前目錄下所有的檔案作為管道符後面命令#wc -l的輸入,從而得出結果統計出當前目錄下的檔案數量為30.

2)作業控制

  • ctrl z可以用來暫停一個任務

例如在我們用# vim編輯一個檔案中,想要臨時暫停任務,就可以使用Ctrl z

如果想要恢復暫停的任務可以使用# fg

  • # jobs命令可以列出已經暫停或後臺執行的任務

如下圖所示

如果有多個已暫停的任務,想要恢復指定的任務,可以使用# fg 任務的id號。使用上圖的例子,如果我們想要恢復對aa.txt檔案的編輯,便可以 # fg 2

  • # bg命令可以使已暫停的任務在後臺繼續執行

例如,我們執行命令#vmstat 1(可以實時顯示系統的狀態),在用Ctrl z暫停任務後,便可以用# bg命令在後臺恢復執行,雖然在螢幕中仍可顯示出vmstat 1 的執行結果,但是不影響操作新的命令,且用#jobs檢視任務,可以發現vmstat 1已經恢復運行了

注:如果在有多個已暫停或在後臺執行的任務時,#fg、#bg後面不加任務ID就會對最後一個任務進行操作

  • # sleep 數字,表示暫停多少秒
  • 在命令後面加shift 7 (&), 可以直接使命令在後臺執行

7. 變數

PATH, HOME, PWD, LOGNAME

  • # env,可以檢視到系統中的變數,系統中的變數通常都是英文大寫

 

 

 

  • # set, 此命令也可以用來檢視變數,與# env不同的是,#set還可以檢視使用者自定義的變數
  • 自定義變數
  • 變數的疊加

 

注:單引號和雙引號

首先說下他們的共同點: 好像就只有

一個,就是它們都可以用來界定一個字串,這個沒什麼好解釋的,真正需要記住的是它們區別,

所以經過整理後,它們的區別主要包括:

1)、單引號屬於強引用,它會忽略所有被引起來的字元的特殊處理,被引用起來的字元會被原

  封不動的使用,唯一需要注意的點是不允許引用自身;

2)、雙引號屬於弱引用,它會對一些被引起來的字元進行特殊處理,主要包括以下情況: 

  1:$加變數名可以取變數的值 ,比如:

  [[email protected] ~]# echo '$PWD'

  $PWD  

  [[email protected] ~]# echo "$PWD"

  /root 

  2:反引號和$()引起來的字元會被當做命令執行後替換原來的字元,比如:

  [[email protected] ~]# echo '$(echo hello world)'

  $(echo hello world)

  [[email protected] ~]# echo "$(echo hello world)"

  hello world

[[email protected] ~]# echo '`echo hello world`'

`echo hello world`

[[email protected] ~]# echo "`echo hello world`"

hello world 

  3:當需要使用字元($  `  "  \)時必須進行轉義,也就是在前面加\ ; 

[[email protected] ~]# echo '$ ` " \'

$ ` " \

[[email protected] ~]# echo "\$ \` \" \\"

$ ` " \

  • 全域性變數

# w, 可以用來檢視,使用者終端的登陸情況

# echo $SSH_TTY, 可以用來檢視當前終端下用來登陸的TTY

一般來說我們在一個shell中定義一個變數的話,只在當前shell中生效,並不在其子shell中生效,如果想要在子shell中也生效,使用# export,例如# export r=1111

注:此全域性變數是指作用於向下的shell,不能作用於上層的shell

如果想要開啟一個子shell,可直接執行# bash命令,同時用pstree可以檢視當前所在的shell

  • #unset 變數的名字,便可取消變數的賦值

 

8.環境變數配置檔案

 

Linux中環境變數包括系統級和使用者級,系統級的環境變數是每個登入到系統的使用者都要讀取的系統變數,而使用者級的環境變數則是該使用者使用系統時載入的環境變數。

所以管理環境變數的檔案也分為系統級和使用者級的,下面貼一個網上找到的講的比較明白的檔案介紹(略作修改)[1]:

系統級:

/etc/profile:該檔案是使用者登入時,作業系統定製使用者環境時使用的第一個檔案,應用於登入到系統的每一個使用者。該檔案一般是呼叫/etc/bash.bashrc檔案。

/etc/bash.bashrc:系統級的bashrc檔案。

/etc/environment:在登入時作業系統使用的第二個檔案,系統在讀取你自己的profile前,設定環境檔案的環境變數。

使用者級(這些檔案處於家目錄下):

~/.profile:每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案。這裡是推薦放置個人設定的地方

~/.bashrc:該檔案包含專用於你的bash shell的bash資訊,當登入時以及每次開啟新的shell時,該該檔案被讀取。不推薦放到這兒,因為每開一個shell,這個檔案會讀取一次,效率肯定有影響。

~/.bash_profile or ~./bash_login:這裡沒有引用作者的,下面會提到

~/.pam_environment:使用者級的環境變數設定檔案,沒有做測試,不知道管不管用。