本文記錄一些在Linux系統下比較經常使用的命令。html
首先介紹下Linux下命令生效的順序:java
$PATH
環境變量設置定義的目錄順序的第一個命令該命令用於複製文件,copy之意,它還能夠把多個文件一次性地複製到一個目錄下,它的經常使用參數以下:node
例:mysql
cp source dest
複製文件cp -r sourceFolder targetFolder
遞歸複製整個文件夾該命令用於移動文件、目錄或改名,move之意,它的經常使用參數以下:linux
注:該命令能夠把一個文件或多個文件一次移動一個文件夾中,可是最後一個目標文件必定要是「目錄」。git
例:github
mv file1 file2 file3 dir
把文件file一、file二、file3移動到目錄dir中mv file1 file2
把文件file1重命名爲file2該命令用於刪除文件或目錄,remove之間,它的經常使用參數以下:正則表達式
例如:sql
rm -i file
刪除文件file,在刪除以前會詢問是否進行該操做rm -fr dir
強制刪除目錄dir中的全部文件tar是linux上經常使用的打包、壓縮、解壓縮工具,它的參數不少,這裏列舉經常使用的壓縮與解壓縮參數。shell
參數:
-c
: 創建壓縮檔案的參數-x
: 解壓縮壓縮檔案的參數-z
: 用gzip
壓縮-j
: 用bzip2
解壓文件-Z
: 用compress
解壓文件-v
: 壓縮的過程當中顯示檔案-f
: 置頂文檔名,在-f
後面當即接文件名,不能再加參數shell tar -cvf images.tar images ← 僅打包,不壓縮
shell tar -xvf filename.tar -C 指定目錄
shell tar -zcvf images.tar.gz images
shell tar -zxvf images.tar.gz
shell tar -zxvf images.tar.gz -C 指定的目錄
shell tar -jcvf images.tar.bz2 images
shell tar -jxvf images.tar.bz2
shell tar -jxvf images.tar.bz2 -C 指定的目錄
tar -zcvf test.tar.gz test
tar -jcvf test.tar.bz2 test
zip -ry test.zip test
-r
:表示遞歸目錄,否則只壓出來一個空目錄。-y
:表示保持符號連接,而不用把符號連接指向的文件也壓進來。結果比較:ll -h test.*
-rw-r--r-- 1 liwenhao staff 45M 8 6 20:12 test.tar.bz2 -rw-r--r-- 1 liwenhao staff 47M 8 6 20:12 test.tar.gz -rw-r--r-- 1 liwenhao staff 50M 8 6 20:13 test.zip
能夠看到:
壓縮率:bzip2 > gzip > zip
備份mysql時,想把以前的文件壓縮,可是用tar czvf /data/backup/test.tar.gz /data/a/b/directory
打開一看,裏面的內容是把整個絕對路徑都放進去了。
若是想實現相對路徑,這樣寫就能夠解決了
tar czvf /data/backup/test.tar.gz /data/a/b/directory 改爲 tar czvf /data/backup/test.tar.gz -C /data/a/b directory
C是臨時切換工做目錄,-P是絕對路徑,在這裏只用到-C參數就好了。
該命令用於將某個時間點的進程運行狀況選取下來並輸出,process之意,它的經常使用參數以下:
"-A"
其實咱們只要記住ps通常使用的命令參數搭配便可,它們並很少,以下:
ps aux
查看系統全部的進程數據ps ax
查看不與terminal有關的全部進程ps -lA
查看系統全部的進程數據ps axjf
查看連同一部分進程樹狀態查看某個進程:
ps –ef|grep tomcat
查看全部有關tomcat的進程ps -ef|grep --color java
高亮要查詢的關鍵字該命令用於向某個工做(jobnumber)或者是某個PID(數字)傳送一個信號,它一般與ps和jobs命令一塊兒使用,它的基本語法以下:
kill -signal PID
signal的經常使用參數(最前面的數字爲信號的代號,使用時能夠用代號代替相應的信號)以下:
例如:
kill -SIGTERM %1
或者 kill -15 %1
kill -SIGHUP PID
或者 kill -1 PID
kill -9 19979
該命令用於向一個命令啓動的進程發送一個信號,它的通常語法以下:
killall [-iIe] [command name]
它的參數以下:
例如:
killall -SIGHUP syslogd
從新啓動syslogd
該命令用於判斷接在file命令後的文件的基本數據,由於在Linux下文件的類型並非之後綴爲分的,因此這個命令對咱們來講就頗有用了,它的用法很是簡單,基本語法以下:
file filename
例如:
file ./test
ln是linux中又一個很是重要命令,它的功能是爲某一個文件在另一個位置創建一個同步的連接.當咱們須要在不一樣的目錄,用到相同的文件時,咱們不須要在每個須要的目錄下都放一個必須相同的文件,咱們只要在某個固定的目錄,放上該文件,而後在 其它的目錄下用ln命令連接(link)它就能夠,沒必要重複的佔用磁盤空間。
ln [參數][源文件或目錄][目標文件或目錄]
Linux文件系統中,有所謂的連接(link),咱們能夠將其視爲檔案的別名,而連接又可分爲兩種 : 硬連接(hard link)與軟連接(symbolic link),硬連接的意思是一個檔案能夠有多個名稱,而軟連接的方式則是產生一個特殊的檔案,該檔案的內容是指向另外一個檔案的位置。硬連接是存在同一個文件系統中,而軟連接卻能夠跨越不一樣的文件系統。
這裏有兩點要注意:
ln命令會保持每一處連接文件的同步性,也就是說,不論你改動了哪一處,其它的文件都會發生相同的變化;
ln的連接又分軟連接和硬連接兩種,軟連接就是ln –s 源文件 目標文件,它只會在你選定的位置上生成一個文件的鏡像,不會佔用磁盤空間,硬連接 ln 源文件 目標文件,沒有參數-s, 它會在你選定的位置上生成一個和源文件大小相同的文件,不管是軟連接仍是硬連接,文件都保持同步變化。
ln指令用在連接文件或目錄,如同時指定兩個以上的文件或目錄,且最後的目的地是一個已經存在的目錄,則會把前面指定的全部文件或目錄複製到該目錄中。若同時指定多個文件或目錄,且最後的目的地並不是是一個已存在的目錄,則會出現錯誤信息。
命令參數:
必要參數: -b 刪除,覆蓋之前創建的連接 -d 容許超級用戶製做目錄的硬連接 -f 強制執行 -i 交互模式,文件存在則提示用戶是否覆蓋 -n 把符號連接視爲通常目錄 -s 軟連接(符號連接) -v 顯示詳細的處理過程 選擇參數: -S "-S<字尾備份字符串> "或 "--suffix=<字尾備份字符串>」 -V "-V<備份方式>"或"--version-control=<備份方式>" --help 顯示幫助信息 --version 顯示版本信息
實例1:給文件建立軟連接
命令:
ln -s log2013.log link2013
輸出:
[root@localhost test]# ll -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log [root@localhost test]# ln -s log2013.log link2013 [root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
說明:
爲log2013.log文件建立軟連接link2013,若是log2013.log丟失,link2013將失效
實例2:給文件建立硬連接
命令:
ln log2013.log ln2013
輸出:
[root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log [root@localhost test]# ln log2013.log ln2013 [root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 2 root bin 61 11-13 06:03 ln2013 -rw-r--r-- 2 root bin 61 11-13 06:03 log2013.log
說明:
爲log2013.log建立硬連接ln2013,log2013.log與ln2013的各項屬性相同
目錄的軟鏈接要謹慎刪除,有可能把原文件目錄下的文件給刪除了。
先創建一個軟鏈接
[root@rekfan.com test]# ls -il 總計 0 1491138 -rw-r–r– 1 root root 48 07-14 14:17 file1 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2hand #創建file1和file1soft軟鏈接 [root@rekfan.com test]# ln -s file1 file1soft [root@rekfan.com test]# ls -il 總計 0 1491138 -rw-r–r– 1 root root 48 07-14 14:17 file1 1491140 lrwxrwxrwx 1 root root 5 07-14 14:24 file1soft -> file1 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2hand
刪除上面創建的軟鏈接
shell [root@rekfan.com test]# ls -il 總計 0 1491138 -rw-r–r– 1 root root 0 07-14 14:17 file1 1491140 lrwxrwxrwx 1 root root 5 07-14 14:24 file1soft -> file1 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2hand #刪除軟鏈接 [root@rekfan.com test]# rm -rf file1soft [root@rekfan.com test]# ls -il 總計 0 1491138 -rw-r–r– 1 root root 0 07-14 14:17 file1 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2 1491139 -rw-r–r– 2 root root 0 07-14 14:17 file2hand
刪除軟連接 確實是用rm 可是!!!
rm -fr xxxx/ 加了個/ 這個是刪除文件夾
rm -fr xxxx 沒有/ 這個是刪除軟連接
該命令用於查看文本文件的內容,後接要查看的文件名,一般可用管道與more和less一塊兒使用,從而能夠一頁頁地查看數據。例如:
cat text | less
查看text文件中的內容
注:這條命令也可使用less text來代替
該命令用於改變文件所屬用戶組,它的使用很是簡單,它的基本用法以下:
chgrp [選項] [組] [文件]
-R
:處理指定目錄以及其子目錄下的全部文件-v
:運行時顯示詳細的處理信息--dereference
:做用於符號連接的指向,而不是符號連接自己--no-dereference
:做用於符號連接自己例如:
chgrp -vR users ./dir
遞歸地把dir目錄下中的全部文件和子目錄下全部文件的用戶組修改成users
該命令用於改變文件的全部者,與chgrp命令的使用方法相同,只是修改的文件屬性不一樣。
該命令用於改變文件的權限,通常的用法以下:
chmod [-R] xyz 文件或目錄
-R:進行遞歸的持續更改,即連同子目錄下的全部文件都會更改
同時,chmod還可使用u(user)、g(group)、o(other)、a(all)和+(加入)、-(刪除)、=(設置)跟rwx搭配來對文件的權限進行更改。
例如:
chmod 755 file
把file的文件權限改變爲-rxwr-xr-x,r表示讀、w表示寫、x表示可執行。
chmod g+w file
向file的文件權限中加入用戶組可寫權限。
chmod +x file
讓文件可執行。
權限代號:
例:
若是什麼參數也不加,find默認搜索當前目錄及其子目錄,而且不過濾任何結果(也就是返回全部文件),將它們全都顯示在屏幕上。
locate命令實際上是"find -name"的另外一種寫法,可是要比後者快得多,緣由在於它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地全部文件信息。Linux系統自動建立這個數據庫,而且天天自動更新一次,因此使用locate命令查不到最新變更過的文件。爲了不這種狀況,能夠在使用locate以前,先使用updatedb命令,手動更新數據庫。 locate命令的使用實例:
locate /etc/sh
,搜索etc目錄下全部以sh開頭的文件。locate ~/m
,搜索用戶主目錄下,全部以m開頭的文件。locate -i ~/m
,搜索用戶主目錄下,全部以m開頭的文件,而且忽略大小寫。whereis命令只能用於程序名的搜索,並且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。若是省略參數,則返回全部信息。 whereis命令的使用實例: whereis grep
which命令的做用是,在PATH變量指定的路徑中,搜索某個系統命令的位置,而且返回第一個搜索結果。也就是說,使用which命令,就能夠看到某個系統命令是否存在,以及執行的究竟是哪個位置的命令。 which命令的使用實例: which grep
搜索文件中的信息,通常爲字符串,與正則表達式結合使用 grep [選項] 字符串 文件名 (字符串使用 "" 包圍,結果爲行記錄) -i 忽略大小寫 -v 排除指定字符串
find與grep的區別:
time 能夠統計命令執行的時間,包括程序的實際運行時間(real time),以及程序運行在用戶態的時間(user time)和內核態的時間(sys time)。
例如:time git pull
則是統計更新代碼花費多長時間
alias命令用來設置指令的別名。咱們可使用該命令能夠將一些較長的命令進行簡化。使用alias時,用戶必須使用單引號''將原來的命令引發來,防止特殊字符致使錯誤。
alias命令的做用只侷限於該次登入的操做。若要每次登入都可以使用這些命令別名,則可將相應的alias命令存放到bash的初始化文件/etc/bashrc
中。
alias 的基本使用方法爲:alias 新的命令='原命令 -選項/參數'
例如:alias l=‘ls -lsh'
將從新定義ls命令,如今只需輸入l就能夠列目錄了。直接輸入 alias 命令會列出當前系統中全部已經定義的命令別名。
要刪除一個別名,可使用 unalias 命令,如 unalias l。
查看系統已經設置的別名:
alias egrep='egrep --color' alias fgrep='fgrep --color' alias grep='grep --color' alias hpush='bash /Users/liwenhao/Desktop/github/hpush.sh' alias ll='ls -l' alias ls='ls -F --show-control-chars --color=auto' alias vi='vim'
tail
命令從指定點開始將文件寫到標準輸出。使用tail命令的-f選項能夠方便的查閱正在改變的日誌文件,tail -f filename
會把filename裏最尾部的內容顯示在屏幕上,而且不但刷新,使你看到最新的文件內容.
tail[必要參數][選擇參數][文件]
-f 循環讀取 -q 不顯示處理信息 -v 顯示詳細的處理信息 -c <數目> 顯示的字節數 -n <行數> 顯示行數 --pid=PID 與-f合用,表示在進程ID,PID死掉以後結束. -q, --quiet, --silent 從不輸出給出文件名的首部 -s, --sleep-interval=S 與-f合用,表示在每次反覆的間隔休眠S秒
# 寫到1.log,且後臺運行 ping www.baidu.com > 1.log 2>&1 & # 循環查看尾部日誌 tail -f 1.log # 殺死 ping進程 killall ping
ls | wc -l
:當前目錄文件個數aa && ls
:只運行aa,ls不運行aa & ls
:aa和ls都運行,可是ls必須等aa運行完。aa || ls
:aa和ls並行執行,互不影響。當咱們寫完一個腳本的時候,它是不能夠被直接運行的。咱們能夠經過:
bash hello.sh
chmod 755 hello.sh
,而後就能夠經過相對路徑 ./hello.sh
或者經過絕對路徑 /root/hello.sh
來執行。$0
, $#
, $*
, $@
, $?
, $$
和命令行參數變量名只能包含數字、字母和下劃線,由於某些包含其餘字符的變量有特殊含義,這樣的變量被稱爲特殊變量。
例如,$$
表示當前Shell進程的ID,即pid,看下面的代碼:
$echo $$
運行結果
29949
特殊變量列表:
變量 | 含義 |
---|---|
$0 |
當前腳本的文件名 |
$n |
傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。 |
$# |
傳遞給腳本或函數的參數個數。 |
$* |
傳遞給腳本或函數的全部參數。 |
$@ |
傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 \(* 稍有不一樣,下面將會講到。 | | `\)?| 上個命令的退出狀態,或函數的返回值。 | | $$` |
運行腳本時傳遞給腳本的參數稱爲命令行參數。命令行參數用 $n
表示,例如,$1
表示第一個參數,$2
表示第二個參數,依次類推。
請看下面的腳本:
#!/bin/bash echo "File Name: $0" echo "First Parameter : $1" echo "First Parameter : $2" echo "Quoted Values: $@" echo "Quoted Values: $*" echo "Total Number of Parameters : $#"
運行結果:
$./test.sh Zara Ali
File Name : ./test.sh First Parameter : Zara Second Parameter : Ali Quoted Values: Zara Ali Quoted Values: Zara Ali Total Number of Parameters : 2
$*
和 $@
的區別$*
和 $@
都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"$1"
"$2"
… "$n"
的形式輸出全部參數。
可是當它們被雙引號(" ")包含時,"$*"
會將全部的參數做爲一個總體,以"$1
$2
… $n
"的形式輸出全部參數;"$@"
會將各個參數分開,以"$1"
"$2"
… "$n"
的形式輸出全部參數。
下面的例子能夠清楚的看到 $*
和 $@
的區別:
#!/bin/bash echo "\$*=" $* echo "\"\$*\"=" "$*" echo "\$@=" $@ echo "\"\$@\"=" "$@" echo "print each param from \$*" for var in $* do echo "$var" done echo "print each param from \$@" for var in $@ do echo "$var" done echo "print each param from \"\$*\"" for var in "$*" do echo "$var" done echo "print each param from \"\$@\"" for var in "$@" do echo "$var" done
執行 ./test.sh "a" "b" "c" "d",看到下面的結果:
$*= a b c d "$*"= a b c d $@= a b c d "$@"= a b c d print each param from $* a b c d print each param from $@ a b c d print each param from "$*" a b c d print each param from "$@" a b c d
$?
能夠獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,通常狀況下,大部分命令執行成功會返回 0,失敗返回 1。
不過,也有一些命令返回其餘值,表示不一樣類型的錯誤。
下面例子中,命令$./test.sh Zara Ali
成功執行輸出:
File Name : ./test.sh First Parameter : Zara Second Parameter : Ali Quoted Values: Zara Ali Quoted Values: Zara Ali Total Number of Parameters : 2 $echo $? 0 $
$?
也能夠表示函數的返回值。
下面的第一種方式關機後會失效,至關於臨時環境變量,後面兩種都是寫進了系統配置,所以會永久生效。
export PATH=$PATH:/usr/local/src/node-v0.10.24/node_modules/node-sass/bin
vi /etc/profile
export PATH=$PATH:/usr/local/src/node-v0.10.24/node_modules/node-sass/bin
source /etc/profile
生效vi /root/.bashrc
export PATH=$PATH:/usr/local/src/node-v0.10.24/node_modules/node-sass/bin
source /root/.bashrc
生效若是修改了/etc/profile
,那麼編輯結束後執行source profile
(source /etc/profile
) 或 執行點命令 . ./profile
,PATH的值纔會當即生效,否則就只有等下一次開機。
這個方法的原理就是再執行一次/etc/profile shell腳本,注意若是用sh /etc/profile是不行的,由於sh是在子shell進程中執行的,即便PATH改變了也不會反應到當前環境中,可是source是在當前 shell進程中執行的,因此咱們能看到PATH的改變。
有時咱們可能不當心將PATH環境變量設置錯誤致使命令失效,能夠參考下面兩種方式解決。
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
命令暫時使用這些目錄下的命令,如 vi
,ls
,cd
,重新修改配置文件。參考文檔: