本系列文章由@超人愛因斯坦出品,轉載請註明出處。
文章鏈接:
http://hpw123.net/a/Linux/Linuxjichu/2014/1031/101.html
作者:超人愛因斯坦 個人網站:http://www.hpw123.net
CSDN:http://blog.csdn.net/u010283694
在Linux的環境下,如果你不懂bash是什麼,那麼其他的東西就不用學了,因爲前面教程使用終端執行命令的方式,就是通過bash的環境處理的,所以它很重要,bash的東西很多,包括變量的設置與使用,bash操作環境的構建,數據流重定向的功能,還有好用的管道命令。
好了,讓我們進入主題吧:
一.硬件、內核與shell
二.bash shell的功能
命令記憶能力(history)
命令與文件補全功能([Tab]按鍵的好處)
命令別名設置功能(alias)
作業控制、前臺、後臺控制(job control, foreground, background)
程序腳本(shell script)
三.bash的環境配置文件
- login與non-login shell
login shell:取得bash時需要完整的登陸流程的,就稱爲login shell,舉例來說,你要由tty1~tty6登陸,需要輸入用戶的賬號密碼,此時取得的bash就稱爲“login shell”
non-login shell:取得bash接口的方法不需要重複登陸的舉動,舉例來說,你以X Window登陸Linux後,在以X的圖形界面啓動終端機,此時那個終端接口並沒有需要再次輸入賬號與密碼,那個bash的環境就稱爲non-login shell了,你在原本bash環境下再次執行bash這個命令,同樣也沒有輸入賬號密碼,那第二個bash(子進程)也是non-login shell
- /etc/profile(login shell纔會讀)
這是系統整體的設置,你最好不要修改這個文件,bash的login shell情況下所讀取的整體環境配置文件其實只有/etc/profile,但是/etc/profile還會調用其他的配置文件
- ~/.bash_profile(login shell纔會讀)
bash在讀完了整體環境設置的/etc/profile並藉此調用其他配置文件,接下來會讀取用戶的個人配置文件,分別是~/.bash_profile ~/.bash_login ~/.profile 其實bash的login shell設置只會讀取三個文件中的一個,讀取順序依照我寫的順序,也就是說~/.bash_profile存在,那麼其他兩個文件不論是否存在,都不會被讀取
- source:讀入環境配置文件的命令
如果你將自己的設置寫入了/etc/profile或~/.bash_profile通常都是註銷後再登陸後改設置纔會生效,那麼能不能直接讀取配置文件二不註銷呢?哈哈,可以的,使用source就ok了,如source /profile
- ~/.bashrc(non-login shell會讀)
當你取得non-login shell 時,該bash配置文件僅會讀取~/.bashrc而已
- 其它相關配置文件
~/.bash_history ~/.bash_logout 想了解這些的朋友可以自行百度啦,百度功底是需要慢慢培養地呢。
- bash默認組合鍵
四.通配符與特殊符號
五.數據流重定向
大家要問,爲何要使用命令輸出重定向?
- 屏幕輸出的信息很重要,而且我們需要將它存下來的時候;
- 後臺執行中的程序,不希望它干擾屏幕正常的輸出結果時;
- 一些系統的例行命令(例如寫在/etc/crontab中的文件)的執行結果,希望它可以存下來時;
- 一些執行命令的可能已知錯誤信息時,想以“2>/dev/null”將它丟掉時;
- 錯誤信息與正確信息需要分別輸出時。
如何進行重定向?
- 標準輸入(stdin):代碼爲0,使用<或<<;
- 標準輸出(stdout):代碼爲1,使用>或>>;
- 標準錯誤輸出(stderr):代碼爲2,使用2>或>>
- 1>:以覆蓋的方法將正確的數據輸出到指定的文件或設備上;
- 1>>:以累加的方法將正確的數據輸出到指定的文件或設備上;
- 2>:以覆蓋的方法將錯誤的數據輸出到指定的文件或設備上;
- 2>>以累加的方法將錯誤的數據輸出到指定的文件或設備上;
//將 stdout 與 stderr 分存到不同的文件去
[hpw@hpw-Lenovo-Erazer-Z500:~]$ find /home -name .bashrc > list_right 2> list_error
/dev/null垃圾桶黑洞設備與特殊寫法
//將錯誤的數據丟棄,屏幕上顯示正確的數據
[hpw@hpw-Lenovo-Erazer-Z500:~]$ find /home -name .bashrc 2> /dev/null /home/dmtsai/.bashrc <==叧有 stdout 會顯示刡屏幕上, stderr 被丟棄了
standard input:<與<<
//用 stdin 替代鍵盤的輸入以建立新檔案的簡單流程
[hpw@hpw-Lenovo-Erazer-Z500:~]# cat > catfile < ~/.bashrc
[hpw@hpw-Lenovo-Erazer-Z500:~]# ll catfile ~/.bashrc -rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc-rw-r--r-- 1 root root 194 Feb 6 18:29 catfile
// 注意看,這兩個檔案的大小會一模一樣!幾乎像是使用 cp 複製一般!
如果我要用cat直接將輸入的信息輸出到catfile中,且當由鍵盤輸入eof時,該次輸入就結束,那我可以這樣做
[hpw@hpw-Lenovo-Erazer-Z500:~]#cat > catfile << "eof"
> This is a test.
> OK now stop
> eof <==輸入這關鍵詞,立刻就結束而不需要輸入 [ctrl]+d
[hpw@hpw-Lenovo-Erazer-Z500:~]# cat catfile
This is a test. OK now stop <==叧有這兩行,不會存在關鍵詞那一行!
五.命令執行的判斷依據: ; && ||
哈哈,如果我想一次輸入多個命令去執行那該怎麼辦啊
在命令與命令中間利用分號(;)來隔開,這樣一來,分號前的命令執行完後就會立刻接着執行後面的命令啦,這真是方便啊,如果前一個命令是否執行成功與後一個命令是否要執行有關,那就得動用到&&和||啦
六.管道命令(pipe)
符號:| 解析:管道符左邊命令的輸出就會作爲管道符右邊命令的輸入
管道命令流程
1.選取命令:cut,grep
[root@www ~]# cut -d'分隔字符' -f fields <==用於有特定分隔字符
[root@www ~]# cut -c 字符區間 <==用於排列整齊的信息
選項參數:
-d :後面接分隔字符。與-f 一起使用;
-f :依據 -d 的分隔字符將一段信息分割成爲數段,用 -f 取出第幾段得意思; -c :以字符 (characters) 的單位取出固定字符區間;
[root@www ~]# grep [-acinv] [--color=auto] '搜尋字符串' filename
選項參數:
-a :將 binary 文件以 text 文件方式搜尋數據
-c :計算找到 '搜尋字符串' 的次數
-i :忽略大小寫的不同,所以大小寫規爲相同
-n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行!
--color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!
2.排序命令:sort,wc,uniq
[root@www ~]# sort [-fbMnrtuk] [file or stdin]
選項參數:
-f :忽略大小寫的差異,例如 A 與a 視爲編碼相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字排序,例如 JAN, DEC 等等的排序方法;
-n :使用『純數字』進行排序(默認是以文字型態排序的);
-r :反向排序;
-u :就是 uniq ,相同的數據中,僅出現一行代表;
-t :分隔符,預謳是用 [tab] 鍵分隔;
-k :以那個區間 (field) 來進行排序的意思
[root@www ~]# uniq [-ic]
選項參數:
-i :忽略大小寫字符的不同;
-c :進行計數
[root@www ~]# wc [-lwm]
選項參數:
-l :僅列出行;
-w :僅列出多少字(英文單字);
-m :多少字符;
3.雙向重定向:tee
[root@www ~]# tee [-a] file
選項參數: -a :以累加 (append) 的方式,將數據加入 file 當中!
//不加a是以覆蓋的方式
4.字符轉換命令:tr,col,join,paste,expand
[root@www ~]# tr [-ds] SET1 ...
選項參數:
-d :刪除信息當中的 SET1 這個字符串;
-s :替代掉重複的字符!
[root@www ~]# col [-xb]
選項參數:
-x :將 tab 鍵轉換成對等的空格鍵
-b :在文字內有反斜槓 (/) 時,僅保留反斜槓最後接的那個字符
[root@www ~]# join [-ti12] file1 file2
選項參數:
-t :join 默認以空格符分隔數據,並且比對『第一個字段』的數據, 如果兩個檔案相同,則將兩筆數據聯成一行,且第一個字段放在第一個!
-i :忽略大小寫的差異;
-1 :這個是數字的 1 ,代表『第一個文件要用那個字段杢來分析』癿意思;
-2 :代表『第二個文件要用那個字段來分析』癿意思。
[root@www ~]# paste [-d] file1 file2
選項參數:
-d :後面可以接分隔字符。預設是以 [tab] 來分隔的!
- :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。
[root@www ~]# expand [-t] file
選項參數:
-t :後面可以接數字。一般來說,一個 tab 按鍵可以用 8 個空格鍵替代。 我們也可以自行定義一個 [tab] 按鍵代表多少個字符呢!
[root@www ~]# split [-bl] file PREFIX
選項參數:
-b :後面可接欲分割成的文件大小,可加單位,例如 b, k, m 等;
-l :以行數來進行分割。
PREFIX :代表前導符的意思,可作爲分割文件前導文字。
5.參數代換:xargs
[root@www ~]# xargs [-0epn] command
選項參數:
-0 :如果輸入的 stdin 中有特殊字符,例如 `, \, 空格鍵等等字符時,這個 -0 參數 可以將他還原成一般字符。這個參數可以用於特殊狀態喔!
-e :這個是 EOF (end of file) 的意思。後面可以接一個字符串,當 xargs 分析到這個字符串時,就會停止繼續工作!
-p :在執行每個指令的 argument 時,都會詢問使用者的意思;
-n :後面接次數,每次 command 指令執行時,要使用幾個參數的意思。
6.關於減號-的用途
在管線命令當中,常常會使用到前一個指令的 stdout 作爲這次的 stdin , 某些指令需要用到文件名 (例如 tar) 來進行處理時,該 stdin 不 stdout 可以利用減號 "-" 來替代, 舉例來說:
[root@www ~]# tar -cvf - /home | tar -xvf -
上面這個例子是說:『我將 /home 裏面的文件給他打包,但打包的數據不是記錄到文件,而是傳送到stdout; 經過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 』。後面的這個 - 則是取用前一個指令的 stdout, 因此,我們就不需要使用 file 了!這是最常見的例子喔!注意注意!
——————————超人愛因斯坦於2014年11月1日更新
ok,今天的內容大概就是這些,如果有什麼寫的不對的,求大神指正,我們下篇文章見:)
呵呵,讓我們輕鬆一下吧 美圖