對于程序員來說,命令行是常用的工具,在Mac和Linux系統(tǒng)中,命令行使用的是Shell語言,對于常用的工具,我都喜歡選把它研究透徹,本文就是我在學習Shell語言時收集和總結(jié)的文檔,為了方便大家,現(xiàn)分享如下:
- Linux命令格式
- 幫助命令
- Shell的啟動配置文件
- Mac系統(tǒng)的Shell的配置文件
- 應(yīng)該使用哪個配置文件
- 命令的查找目錄
- 常用命令
- 問題解決方案
- 多個命令在一行中執(zhí)行
()
和{}
的區(qū)別
Linux命令格式
command [options] [arguments]
其中,各符號的表示的含意如下:
-
command
:命令 -
options
:選項;有2種表示法:-
--
單詞:由前面2個-
和2個(包含2個)以上的字母組成; -
-
單字:前面1個-
和1個字母組成;
-
-
argument
:參數(shù)
在查看命令幫助時,會出現(xiàn)[],<>,|
等符號,它們的含義如下:
-
[]
:表示是可選的; -
<>
:表示是可變化的; -
x|y|z
:表示只能選擇一個; -
-abc
:表示三個參數(shù)(或任何二個)的混合使用; -
/
:或者;
幫助命令
help <Command>
適用于內(nèi)部命令
<Command> –help/-h
適用于外部命令
man <Command>
查看命令描述或手冊頁(Manual);
備注:
manual 手冊是分章節(jié)的;man # Command
(#表示章節(jié)號)
各個章節(jié)的所講的內(nèi)容如下:
- 所有用戶可以使用的命令
- 系統(tǒng)內(nèi)核調(diào)用,不是每個命令都有系統(tǒng)調(diào)用(如:
man 2 read
) - 庫調(diào)用
- 特殊文件,如:
/dev/tty1
- 文件格式(命令配置文件的語法,如:
man 5 passwd
) - 游戲相關(guān)
- 雜項
- 管理員命令,如:
fdisk
man命令查詢操作參考《vi,vim用法》中的命令模式
man命令格式符意義:
-
[]
:可選內(nèi)容; -
<>
:必須給出內(nèi)容; -
a|b|c
:多選一; -
…
:可以有多個;
info <Command>
有超鏈接的文檔,info 提供信息頁,提供作者、版本,什么時候發(fā)布等更詳細信息,man手冊是告訴你怎么用;
README
絕大多數(shù)程序都有相應(yīng)的幫助文檔,保存在 /usr/share/doc
文件夾中;
Shell的啟動配置文件
當我們登錄系統(tǒng)后,啟動 bash 程序,并且會讀取一系列稱為啟動文件的配置腳本,這些文 件定義了默認的可供所有用戶共享的 shell 環(huán)境。然后是讀取更多位于我們自己主目錄中的啟 動文件,這些啟動文件定義了用戶個人的 shell 環(huán)境。精確的啟動順序依賴于要運行的 shell 會 話類型。有兩種 shell 會話類型:一個是登錄 shell 會話,另一個是非登錄 shell 會話。
登錄 shell 會話會提示用戶輸入用戶名和密碼;例如,我們啟動一個虛擬控制臺會話。當我 們在 GUI 模式下運行終端會話時,非登錄 shell 會話會出現(xiàn)。
登錄 shell 會讀取一個或多個啟動文件,正如表 12 - 2 所示:
非登錄 shell 會話會讀取以下啟動文件:
除了讀取以上啟動文件之外,非登錄 shell 會話也會繼承它們父進程的環(huán)境設(shè)置,通常是一個登錄 shell。
瀏覽一下你的系統(tǒng),看一看系統(tǒng)中有哪些啟動文件。記住-因為上面列出的大多數(shù)文件名 都以圓點開頭(意味著它們是隱藏文件),你需要使用帶 -a
選項的 ls 命令。
在普通用戶看來,文件 ~/.bashrc
可能是最重要的啟動文件,因為它幾乎總是被讀取。非 登錄 shell 默認會讀取它,并且大多數(shù)登錄 shell 的啟動文件會以能讀取 ~/.bashrc
文件的方式 來書寫。
Mac系統(tǒng)的Shell的配置文件
打開mac終端,輸入:
echo $SHELL
如果輸出的是:csh 或者是 tcsh,那么你用的就是 C Shell。
如果輸出的是:bash,sh,zsh,那么你的用的可能就是 Bourne Shell 的一個變種。
Mac OS X 10.2之前默認的是C Shell。
Mac OS X 10.3之后默認的是Bourne Shell。
在這里只介紹Bourne Shell(sh)關(guān)于配置文件的等級介紹。
在Bourne Shell下有三種配置文件,如下:
/ect/profile
/ect/bashrc
~/.bash_profile
注意:
- 有些文章說:Linux里邊是
.bashrc
而MAC 是.bash_profile
,所以Mac下只需要設(shè)置profile
和.bash_profile
,但是我發(fā)現(xiàn)mac下也有/ect/bashrc
配置文件;
它們的作用如下:
/ect/profile
(一般不建議修改這個文件)
全局(公有)配置,不管是哪個用戶,登陸是都會讀取該文件。-
~/.bash_profile
- 一般在這個文件中添加用戶級環(huán)境變量;
- 若bash shell是以login方式執(zhí)行時,才會讀取此文件。該文件僅僅執(zhí)行一次默認情況下,他設(shè)置一些環(huán)境變量。
- 在
.bash_profile
中設(shè)置的配置信息只有在打開終端的時候執(zhí)行有效,終端關(guān)閉后,之前的設(shè)置的命令則無效;
-
/ect/bashrc
(mac沒有此配置文件)- 全局(公有)配置,bash shell執(zhí)行時,不管是何種方式,都會讀取此文件。
- 可以加入mysqlstart、mysql和mysqladmin命令的別名,保證每一個用戶都可以使用這3個命令。
應(yīng)該使用哪個配置文件
按照通常的規(guī)則,添加目錄到你的 變量或者是定義額外的環(huán)境變量,要把這些 更改放置到 文件中(或者其替代文件中,根據(jù)不同的發(fā)行版。例如,使用文件)。對于其它的更改,要放到 文件中。除非你是系統(tǒng)管理員,需要為系統(tǒng) 中的所有用戶修改默認設(shè)置,那么則限定你只能對自己主目錄下的文件進行修改。當然,有可 能會更改 目錄中的文件,比如說 文件,而且在許多情況下,修改這些文件也是明智 的,但是現(xiàn)在,我們要安全起見。
命令的查找目錄
當在終端直接輸入命令時,如:guobinyongMac:~ guobinyong$ ls
,系統(tǒng)會在一些指定的目錄中查找相應(yīng)命令的可執(zhí)行文件,然后執(zhí)行查找到的可執(zhí)行文件;如果命令的可執(zhí)行文件不在默認的目錄中,則需要在輸入命令時寫出命令的路徑,如:
假設(shè)我需要執(zhí)行命令 gby
,而 gby
文件在目錄./PATH/
下,則需要這樣輸入命令:
guobinyongMac:~ guobinyong$ ./PATH/gby
這樣是不太方便的,如果不想輸入命令的路徑,則可以把命令的所在目錄配置為終端的命令查找目錄;
如何配置呢?通過PATH變量!
PATH變量中保存的是命令查找路徑的列表,目錄之間用冒號 :
分隔;配置方法如下:
在終端的配置文件 ~/.bash_profile
(如果不存在,則創(chuàng)建該文件)中添加如下代碼:
export PATH=$PATH:新的路徑 //把您要添加的路徑寫在$PATH:后面
常用命令
export命令
export命令Shell內(nèi)建命令 export命令用于將shell變量輸出為環(huán)境變量,或者將shell函數(shù)輸出為環(huán)境變量。
一個變量創(chuàng)建時,它不會自動地為在它之后創(chuàng)建的shell進程所知。而命令export可以向后面的shell傳遞變量的值。當一個shell腳本調(diào)用并執(zhí) 行時,它不會自動得到原為腳本(調(diào)用者)里定義的變量的訪問權(quán),除非這些變量已經(jīng)被顯式地設(shè)置為可用。export命令可以用于傳遞一個或多個變量的值到任何后繼腳本。
語法:
export(選項)(參數(shù))
選項:
-
-f
:代表[變量名稱]中為函數(shù)名稱; -
-n
:刪除指定的變量。變量實際上并未刪除,只是不會輸出到后續(xù)指令的執(zhí)行環(huán)境中; -
-p
:列出所有的shell賦予程序的環(huán)境變量。
參數(shù):
- 變量:指定要輸出或者刪除的環(huán)境變量。
alias命令
Shell內(nèi)建命令 alias命令用來設(shè)置指令的別名。我們可以使用該命令可以將一些較長的命令進行簡化。使用alias時,用戶必須使用單引號''將原來的命令引起來,防止特殊字符導(dǎo)致錯誤。
alias命令的作用只局限于該次登入的操作。若要每次登入都能夠使用這些命令別名,則可將相應(yīng)的alias命令存放到bash的初始化文件/etc/bashrc中。
語法:
alias(選項)(參數(shù))
選項:
-
-p
:打印已經(jīng)設(shè)置的命令別名。
參數(shù):
命令別名設(shè)置:定義命令別名,格式為命令別名='實際命令'
。
示例:
alias 的基本使用方法為:
alias 新的命令='原命令 -選項/參數(shù)'
例如:alias l='ls -lsh'
將重新定義ls命令,現(xiàn)在只需輸入 l
就可以列目錄了。直接輸入 alias 命令會列出當前系統(tǒng)中所有已經(jīng)定義的命令別名。
備注:
要刪除一個別名,可以使用 unalias 命令,如 unalias l。
問題解決方案
輸出目錄層級結(jié)構(gòu)
find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
多個命令在一行中執(zhí)行
為了方便用戶一鍵操作,經(jīng)常會有將多個命令寫在一行的需求;這種需求的實現(xiàn)方式有多種,如下:
方式1:命令之間用;
(分號)隔開
語法
命令 ; 命令
命令會依次執(zhí)行;
方式2:命令之間用&&
隔開
語法
命令 && 命令
&&
是具有短路特性的邏輯與運算符;
應(yīng)用在兩個命令語句間表示:只有在前一個命令執(zhí)行成功后,才會執(zhí)行下一個;
方式3:命令之間用||
隔開
語法
命令 || 命令
||
是具有短路特性的邏輯或運算符;
應(yīng)用在兩個命令語句間表示:只有在前一個命令執(zhí)行失敗后,才會執(zhí)行下一個命令;
方式4:用()
包裹
語法
(命令1;命令2)
開啟一個子Shell環(huán)境來執(zhí)行括號中的命令。
方式5:用{}
包裹
語法
{ 命令1;命令2; }
在當前的Shell中執(zhí)行 {}
中的命令;
()
和{}
的區(qū)別
相同點:
-
()
和{}
都是把一串的命令放在括號里面,并且命令之間用;
號隔開
不同點:
-
()
只是對一串命令重新開一個子shell進行執(zhí)行,{}
對一串命令在當前shell執(zhí)行 -
()
最后一個命令可以不用分號,{}
最后一個命令要用分號 -
()
里的第一個命令和左邊括號不必有空格,{}
的第一個命令和左括號之間必須要有一個空格 -
()
和{}
中括號里面的某個命令的重定向只影響該命令.但括號外的重定向則影響到括號里的所有命令