1. 程式人生 > >linux鳥哥私房菜學習筆記--第11章

linux鳥哥私房菜學習筆記--第11章

1 認識bash shell
優點:

  • 命令記憶功能(history):~/.bash_history記錄的是前一次登入以前所執行的命令,而至於這一次登入執行的命令都被暫存在臨時記憶體中,當登出系統的時候,才會儲存到~/.bash_history中。
  • 命令與檔案補全功能([Tab]鍵的好處)
  • 命令別名設定功能:alias lm = ‘ls -al’
  • 作業控制檯、前臺、後臺控制
  • 程式指令碼
  • 萬用字元

type:bash shell的內建命令,用來檢視命令是否為bash的內建命令,感覺然並卵。

2.shell的變數功能

變數的顯示與設定:echo、unset
myname=lili 注意=號之間不能有空格
echo $myname 顯示變數的值
unset myname 取消這個變數

環境變數(重要):功能有主資料夾的變換,提示符的顯示,執行檔案查詢的路徑等。可通過env與export檢視,另外,set檢視所有的變數,包括環境變數與自定義變數。

HOME–代表使用者的主資料夾。
SHELL–目前環境使用的shell程式
HISTSIZE–記錄歷史命令的條數
MAIL–當我們使用mail這個令在收信時系統會去讀取的郵件信箱檔案。
PATH–執行檔案查詢的路徑,目錄與目錄中間以冒號分分隔,檔案查詢是以PATH的變數內的目錄來查詢。
LANG–語系資料
RANDOM–隨機數的變數

其中PATH變數最為重要,安裝java,maven,mysql等需要設定的環境變數,在win下是直接找到計算機->管理->高階->環境變數這個直接找到或者新建就行,mac則有點像linux了,要進入到.bash_profile中將java等的變數加入到PATH中,並且要export PATH才能起作用。

3.命令別名與歷史命令:

alias lm=’ls -l | more’
這時,執行lm就相當於執行 ls -al more。
unalias lm
取消別名

history:
n :數字,意思是『要列出最近的 n 筆命令列表』的意思!
-c :將目前的 shell 中的所有 history 內容全部消除
-a :將目前新增的 history 命令新增入 histfiles 中,若沒有加 histfiles ,
則預設寫入 ~/.bash_history
-r :將 histfiles 的內容讀到目前這個 shell 的 history 記憶中;
-w :將目前的 history 記憶內容寫入 histfiles 中!

4.bash的操作環境

login 與 non-login shell:
login shell:取得 bash 時需要完整的登陸流程的,就稱為 login shell。舉例來說,你要由 tty1 ~ tty6 登陸,需要輸入使用者的賬號與密碼,此時取得的 bash 就稱為『 login shell 』囉;

non-login shell:取得 bash 介面的方法不需要重複登陸的舉動,舉例來說,(1)你以 X window 登陸 Linux 後, 再以 X 的圖形化介面啟動終端機,此時那個終端介面並沒有需要再次的輸入賬號與密碼,那個 bash 的環境就稱為 non-login shell了。(2)你在原本的 bash 環境下再次下達 bash 這個命令,同樣的也沒有輸入賬號密碼, 那第二個 bash (子程式) 也是 non-login shell 。

一般來說,login shell 其實只會讀取這兩個配置檔案:
/etc/profile:這是系統整體的配置,你最好不要修改這個檔案;
~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬於使用者個人配置,你要改自己的資料,就寫入這裡!
在 login shell 的 bash 環境中,所讀取的個人偏好配置檔案其實主要有三個,依序分別是:
~/.bash_profile
~/.bash_login
~/.profile

配置檔案生效需要重啟機器,也可用 source+檔名 命令載入。

以上配置檔案只列出了幾個重要的,還有很多其他的配置檔案,用到了查書就行。

5.資料流重定向:資料流重導向就是將某個命令執行後應該要出現在螢幕上的資料, 給他傳輸到其他的地方

標準輸出與標準錯誤輸出:標準輸出指的是『命令執行所回傳的正確的資訊』,而標準錯誤輸出可理解為『 命令執行失敗後,所回傳的錯誤資訊』。

  • 標準輸入  (stdin) :程式碼為 0 ,使用 < 或 << ;
  • 標準輸出  (stdout):程式碼為 1 ,使用 > 或 >> ;
  • 標準錯誤輸出(stderr):程式碼為 2 ,使用 2> 或 2>> ;

標準錯誤輸出:

  • 1> :以覆蓋的方法將『正確的資料』輸出到指定的檔案或裝置上;
  • 1>>:以累加的方法將『正確的資料』輸出到指定的檔案或裝置上;
  • 2> :以覆蓋的方法將『錯誤的資料』輸出到指定的檔案或裝置上;
  • 2>>:以累加的方法將『錯誤的資料』輸出到指定的檔案或裝置上;

將正確資訊與錯誤資訊分別輸入到不同檔案中:
find /home -name .bashrc > list_right 2> list_error

將正確與錯誤資料通通寫入同一個檔案去:
find /home -name .bashrc > list 2>&1

利用 cat 命令來建立一個檔案的簡單流程:
cat > catfile
testing
cat file test
<==這裡按下 [ctrl]+d 來離開

cat > catfile << “eof”
This is a test.
OK now stop
eof <==輸入這關鍵詞,立刻就結束而不需要輸入 [ctrl]+d

用 stdin 取代鍵盤的輸入以建立新檔案的簡單流程:
cat > catfile < ~/.bashrc

命令執行的判斷依據: ; , &&, ||
直接給個鳥哥的例子:
例題:
以 ls 測試 /tmp/vbirding 是否存在,若存在則顯示 “exist” ,若不存在,則顯示 “not exist”!
答:
這又牽涉到邏輯判斷的問題,如果存在就顯示某個資料,若不存在就顯示其他資料,那我可以這樣做:

ls /tmp/vbirding && echo "exist" || echo "not exist"

意思是說,當 ls /tmp/vbirding 執行後,若正確,就執行 echo “exist” ,若有問題,就執行 echo “not exist” !那如果寫成如下的狀況會出現什麼?

ls /tmp/vbirding || echo "not exist" && echo "exist"

這其實是有問題的,為什麼呢?由圖 5.2.1 的流程介紹我們知道命令是一個一個往後執行, 因此在上面的例子當中,如果 /tmp/vbirding 不存在時,他會進行如下動作:
若 ls /tmp/vbirding 不存在,因此回傳一個非為 0 的數值;
接下來經過 || 的判斷,發現前一個命令回傳非為 0 的數值,因此,程式開始執行 echo “not exist” ,而 echo “not exist” 程式肯定可以執行成功,因此會回傳一個 0 值給後面的命令;
經過 && 的判斷,咦!是 0 啊!所以就開始執行 echo “exist” 。
所以啊,嘿嘿!第二個例子裡面竟然會同時出現 not exist 與 exist 呢!真神奇~

由於命令是一個接著一個去執行的,因此,如果真要使用判斷, 那麼這個 && 與 || 的順序就不能搞錯。一般來說,假設判斷式有三個,也就是:

command1 && command2 || command3

而且順序通常不會變,因為一般來說, command2 與 command3 會放置肯定可以執行成功的命令, 因此,依據上面例題的邏輯分析,您就會曉得為何要如此放置囉~這很有用的啦!而且…..考試也很常考~