Linux基礎教程之命令的使用(轉)

worldblog發表於2007-08-10
Linux基礎教程之命令的使用(轉)[@more@]

  對於 Linux 新手,或者那些想要重新審視或改進自己對基本 Linux 概念(比如:複製和移動檔案、建立符號和硬連結、設定檔案系統物件所有權和許可權以及同管道和重定向一起使用 Linux 的標準文字處理命令)的理解的人來說,本系列連載文章之一是理想的教材。沿著這個方向,我們將一起分享很多心得、技巧和竅門,使該教程甚至對於那些具有豐富經驗的 Linux 老手來說都是“有血有肉”,並且是實用的。

  對於初學者而言,本系列文章的許多內容都很新穎,而更有經驗的 Linux 使用者可能會發現本教程是使他們基本的 Linux 技能“爐火純青”的有效途徑。

  介紹 bash

  shell

  如果您使用過 Linux 系統,那麼您知道當登入時,將會看到像這樣的提示符:

  $

  您所看到的特殊的提示符可能看起來很不一樣。它可能包含系統的主機名、當前的工作目錄名,或者兩者都有。但是不管這個特殊的提示符看起來像什麼,有一件事是肯定的。列印出這個提示符的程式叫“shell”,極有可能您的特殊的 shell 是一個叫 bash 的程式。

  您在執行 bash 嗎?

  您可以透過輸入下面的命令來檢查您是否正在執行 bash:

$ echo $SHELL

/bin/bash

  如果上面的命令列報錯或者不會類似地響應我們的示例,那麼您可能正在執行一個不同於 bash 的 shell。

  關於 bash

  Bash 是“Bourne-again shell”的首字母縮寫,它是大多數 Linux 系統預設的 shell。shell 的任務是執行您的命令,使您能夠與 Linux 系統進行互動。當您輸完命令,您可以通知 shell 執行 exit 或 logout 命令,在此您將返回到登入提示符。順便提一下,您還可以透過在 bash 提示符下按 control-D 來登出。

  使用“cd”

  您可能已經發現,目不轉睛地盯著bash提示符可不是世界上最讓人感到有勁的事。那麼,讓我們來開始用 bash 來瀏覽我們的檔案系統。在提示符下,輸入下面的命令(不包括 $):

  $ cd /

  我們只告訴 bash 您想在 /(也稱為根目錄)中工作;系統上的所有目錄形成一棵樹,/ 被認為是這棵樹的頂部,或者是根。cd設定當前您正在工作的目錄,也稱為“當前工作目錄”。

  路徑

  要看 bash 的當前工作目錄,您可以輸入:

$ pwd

/

  在上面的示例中,cd 的 / 引數叫做路徑。它告訴 cd 我們要轉到什麼地方。特別是,/ 引數是一個絕對路徑,意味著它指定了相對於檔案系統樹的根的位置。絕對路徑這裡有幾個其它的絕對路徑:

  /dev

/usr

/usr/bin

/usr/local/bin

  您可以看到,所有絕對路徑有一個共同點就是,它們都以/開頭。透過路徑/usr/local/bin,我們告訴 cd 進入 / 目錄,接著進入這個目錄之下的usr目錄,然後再進入 local 和 bin。絕對路徑總是透過是否以 / 開頭來判斷。

  相對路徑

  另一種路徑叫相對路徑。在 Bash 中,cd 以及其它命令總是解釋那些相對於當前目錄的路徑。相對路徑絕不會以 / 開頭。這樣,如果我們在 /usr 中:

  $ cd /usr

  那麼,我們可以使用相對路徑來轉到 /usr/local/bin 目錄:

  $ cd local/bin

$ pwd

/usr/local/bin

  使用“..”

  相對路徑還可以包含一個或多個 .. 目錄。.. 目錄是指向父目錄的專門目錄。那麼,繼續前面的示例:

  $ pwd

/usr/local/bin

$ cd ..

$ pwd

/usr/local

  您可以看到,現在我們的當前目錄是 /usr/local。我們能夠“後退”到相對於我們所在的當前目錄的一個目錄。此外,我們還可以將 ".." 新增到一個現有的相對路徑中,使我們可以進入與我們已在目錄並排的目錄,例如:

  $ pwd

/usr/local

$ cd ../share

$ pwd

/usr/share

  相對路徑示例

  相對路徑可以變得相當複雜。這裡有幾個示例,所有的都沒有顯示出結果的目標路徑。請試著推斷一下,輸入這些命令後,您最終將會轉到什麼地方:

  $ cd /bin

$ cd ../usr/share/zoneinfo

$ cd /usr/X11R6/bin

$ cd ../lib/X11

$ cd /usr/bin

$ cd ../bin/../bin

  現在,試驗一次,看看您的推斷是否正確。

  理解“.”

  在我們結束 cd 的介紹之前,我們還需要討論一些更多的內容。首先,還有另一個叫 . 的專門的目錄。它表示“當前目錄”。然而該目錄不為 cd 命令使用,它通常用來執行一些當前目錄中的程式,如下所示:

  $ ./myprog

  在上面的示例中,駐留在當前工作目錄中的 myprog 可執行檔案將被執行。

  cd 和主目錄

  如果我們想要轉到主目錄,我們可以輸入:

  $ cd

  沒有引數,cd 將轉到主目錄,對於超級使用者來說是 /root,對於一般使用者來說通常是/home/username。但是,如果我們想要指定一個主目錄中的檔案,將會怎樣呢?可能我們想要將一個檔案引數傳給 myprog 命令。如果該檔案在主目錄中,我們可以輸入:

  $ ./myprog /home/drobbins/myfile.txt

  但是,使用像這樣的絕對路徑並不總是很方便。幸好,我們可以使用 ~(代字元)字元來完成同樣的事:

  $ ./myprog ~/myfile.txt

  其他使用者的主目錄Bash 將把單獨的 ~ 擴充套件為指向主目錄,然而您還可以用它來指向其他使用者的主目錄。例如,如果我們想要引用 fred 的主目錄中的名為 fredsfile.txt 的檔案,可以輸入:

$ ./myprog ~fred/fredsfile.txt

  使用 Linux 命令

  介紹 ls

  現在,我們將快速地看一看 ls 命令。很可能,您已經很熟悉 ls,並且知道只輸入 ls 本身將列出當前工作目錄的內容: $">[b]透過指定 -a 選項,您可以看到目錄中的所有檔案,包括隱藏檔案 — 那些以 . 開頭的檔案。您可以在下面的示例中看到,ls -a 將顯示 . 和 .. 專門的目錄連結:$">[b]遞迴和索引節點清單。

  您可以使用 -d 來檢視目錄本身,而您還可以用 -R 來完成相反的工作 — 不僅只檢視一個目錄內部,而且要遞迴地檢視該目錄內所有的目錄內部!我們將不會有對應該選項的任何示例輸出(因為它一般佔很大的篇幅),但是為了感覺一下它是怎樣工作的,您可以試幾個 ls -R 和 ls -Rl 命令。最後,ls 的 -i 選項可以用來在清單中顯示檔案系統物件的索引節點號:

  $ ls -i /usr

1409 X11R6 314258 i686-linux

43090 libexec 13394 sbin

1417 bin 1513 i686-pc-linux-gnu

5120 local 13408 share

8316 distfiles 1517 include

776 man 23779 src

43 doc 1386 info 93892 portage

36737 ssl

70744 gentoo-x86 1585 lib 5132

portage.old 784 tmp

  理解索引節點,第 1 部分

  檔案系統的每個物件都分配到一個獨一無二的索引,叫做索引節點號。這可能看起來微不足道,但是理解索引節點對於理解許多檔案系統操作來說很重要。例如,請考慮出現在每個目錄中的 . 和 .. 連結。為了完全理解 .. 目錄實際上是什麼,我們將先來看一看 /usr/local 的索引節點號:

  $ ls -id /usr/local

5120 /usr/local

/usr/local

  目錄有一個 5120 索引節點號。現在,我們來看一 看 /usr/local/bin/.. 的索引節點號:

  $ ls -id /usr/local/bin/..

5120 /usr/local/bin/..

  您可以看到,/usr/local/bin/..具有和/usr/local相同的索引節點號!這就是我們抓住的問題的實質。過去,我們認為 /usr/local 是這個目錄本身。

  現在,我們發現索引節點 5120實際上是這個目錄,並且我們發現了指向該索引節點的兩個目錄條目(叫做“連結”)。/usr/local 和 /usr/local/bin/..都連結到索引節點 5120。雖然索引節點 5120 只在磁碟中的一地方存在,但是多個目錄條目都連結到它上面。事實上,透過使用 ls -dl 命令,我們可以看到索引節點 5120 被引用的總次數

  $ ls -dl /usr/local

drwxr-xr-x 8 root root 240 Dec 22 20:

57 /usr/local

  如果我們看一看從左起的第二欄,我們可以看到目錄 /usr/local(索引節點 5120)被引用了 8 次。在我的系統中,引用該索引節點的不同路徑有這些:

  /usr/local

/usr/local/.

/usr/local/bin/..

/usr/local/games/..

/usr/local/lib/..

/usr/local/sbin/..

/usr/local/share/..

/usr/local/src/..

  mkdir

  我們來快速地看一看 mkdir 命令,它可以用來建立新目錄。下面的示例建立了三個新目錄:tic、tac 和 toe,都在 /tmp 下:

  $ cd /tmp

$ mkdir tic tac toe

  預設情況下,mkdir 不會為您建立父目錄;鄰接的上一元素的完整路徑必須存在。因此,如果您想要建立目錄 won/der/ful,您將需要發出三個單獨的 mkdir 命令:

  $ mkdir won/der/ful

mkdir: cannot create directory

`won/der/ful': No such file or directory

$ mkdir won

$ mkdir won/der

$ mkdir won/der/ful

  mkdir -p

  然而,mkdir有一個很方便的-p選項,該選項告訴mkdir建立所有缺少的父目錄,如下所示:

  $ mkdir -p easy/as/pie

  總之,非常簡單。要學習更多關於 mkdir 命令的知識,請輸入 man mkdir 來閱讀手冊頁。除 cd(它內建在 bash 中)之外,這幾乎適用於這裡所涉及的所有命令(比如 man ls)。

  touch

  現在,我們將要快速地看一看 cp 和 mv 命令,這些命令用來複制、重新命名以及移動檔案和目錄。為了開始該概述,我們將首先用 touch 命令在 /tmp 中建立一個檔案:

  $ cd /tmp

$ touch copyme

  如果檔案存在,touch 命令將更新檔案的“mtime”(請回想 ls -l 輸出中的第六欄)。如果檔案不存在,那麼將建立一個新的空檔案。現在您應該有一個大小為零的 /tmp/copyme 檔案。

  echo 和重定向

  既然檔案存在,我們來把一些資料新增到檔案中。我們可以使用echo命令來完成,它帶有自己引數,並且把這些引數列印到標準輸出。首先,單獨的 echo 命令是這樣的:

  $ echo "firstfile"

firstfile

  帶有輸出重定向的同樣的 echo 命令為:

  $ echo "firstfile" > copyme

  大於符號告訴 shell 將 echo 的輸出寫到名為 copyme 的檔案中。如果該檔案不存在,將建立這個檔案;如果該檔案存在,將覆蓋這個檔案。透過輸入 ls -l,我們可以看到 copyme 檔案為 10 個位元組長,因為它包括 firstfile 這個詞和換行符:

  $ ls -l copyme

-rw-r--r-- 1 root root 10 Dec 28 14:13 copyme

  cat 和 cp

  為了在終端顯示檔案的內容,要使用 cat 命令:

  $ cat copyme

firstfile

  現在,我們可以使用 cp 命令的基本呼叫來由原始的 copyme 檔案建立 copiedme 檔案:

  $ cp copyme copiedme

  透過觀察,我們發現它們確實是相互獨立的檔案;它們的索引節點號不同:

  $ ls -i copyme copiedme

648284 copiedme 650704 copyme

  mv

  現在,我們來用“mv”命令將“copiedme”重新命名為“movedme”。其索引節點號將仍然是同一個;但是,指向該索引節點的檔名將改變。

  $ mv copiedme movedme

$ ls -i movedme

648284 movedme

  只要目標檔案和原始檔駐留在同一檔案系統上,被移動的檔案的索引節點號就將仍然不變。在本教程系列的第 3 部分,我們將進一步看一下檔案系統。

  建立連結和刪除檔案

  硬連結

  當談及目錄條目和索引節點之間關係時,我們提到了連結這個術語。Linux 實際有兩種連結。到此為止我們所討論的這種連結叫硬連結。一個給定的索引節點可以有任意數目的硬連結,該索引節點一直存在於檔案系統,直到所有的硬連結消失。可以使用 ln 命令來建立新的硬連結

  $ cd /tmp

$ touch firstlink

$ ln firstlink secondlink

$ ls -i firstlink secondlink

15782 firstlink 15782 secondlink

  您可以看到,硬連結工作於索引節點級別,指向特殊的檔案。在 Linux 系統上,硬連結有幾個侷限性。第一,您只能給檔案建立硬連結,而不能給目錄建立硬連結。的確如此;即便 . 和 .. 是系統給目錄建立的硬連結,也不允許您(“root”使用者也不行)建立任何您自己的硬連結。

  硬連結的第二個侷限性是它們不能跨檔案系統。這意味著,如果您的 / 和 /usr 存在於不同的檔案系統,您不能建立從 /usr/bin/bash 到 /bin/bash 的連結。

  符號連結

  實際上,符號連結(symbolic link,或“symlinks”)比硬連結更常用到。符號連結是一種專門的檔案型別,在這種檔案型別中,連結透過名稱引用另一個檔案,而不是直接引用索引節點。符號連結不阻止檔案被刪除;如果目標檔案消失,那麼符號連結僅僅是不可用,或“被破壞”。

  透過將 -s 選項傳給 ln,可以建立符號連結。

  $ ln -s secondlink thirdlink

$ ls -l firstlink secondlink thirdlink

-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:

08 firstlink

-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:

08 secondlink

lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:

39 thirdlink -> secondlink

  在 ls -l 輸出中,可以用三種方式區分符號連結和一般檔案。第一,請注意第一欄包含一個 l 字元的輸出表明是符號連結。第二,符號連結的大小是目標檔案(本例是 secondlink)的字元數。第三,輸出的最後一欄顯示目標檔名。

  符號連結通常比硬連結更靈活。您可以給任何型別的檔案系統物件(包括目錄)建立符號連結。又因為符號連結的實現是基於路徑的(而不是索引節點),所以建立指向另一個檔案系統上的物件的符號連結是完全可行的。但是,這一事實也使符號連結理解起來很複雜。請考慮我們想要在/tmp中建立一個指向/usr/local/bin的連結的情況。我們應該輸入:

  $ ln -s /usr/local/bin bin1

$ ls -l bin1

lrwxrwxrwx 1 root root 14 Jan 1 15:

42 bin1 -> /usr/local/bin

  或者還可以輸入:

  $ ln -s ../usr/local/bin bin2

$ ls -l bin2

lrwxrwxrwx 1 root root 16 Jan 1 15:

43 bin2 -> ../usr/local/bin

  您可以看到,兩個符號連結都指向同一目錄。但是,如果我們的第二個符號連結在任何時刻被移動到另一個目錄,由於相對路徑的緣故,它將遭到“破壞”。

  $ ls -l bin2

lrwxrwxrwx 1 root root 16 Jan 1 15:

43 bin2 -> ../usr/local/bin

$ mkdir mynewdir

$ mv bin2 mynewdir

$ cd mynewdir

$ cd bin2

bash: cd: bin2: No such file or directory

  因為/tmp/usr/local/bin這個目錄不存在,我們不能再把目錄轉到bin2;換句話說,bin2 現在被破壞了。

  由於這個原因,有時避免用相對路徑資訊來建立符號連結是個好主意。但是,在許多情況下,相對的符號連結很管用。請考慮一個示例,在這個示例中您想要給 /usr/bin 中的一個程式建立一個別名:

  # ls -l /usr/bin/keychain

-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain

  作為 root 使用者,您可能想要給“keychain”建立一個別名,比如“kc”。在這個示例中,我們有 root 訪問權,由 bash 提示符改變為“#”可以證明。我們之所以需要 root 訪問權是因為一般使用者不能在 /usr/bin 中建立檔案。作為 root 使用者,我們可以像下面這樣給 keychain 建立一個別名:

  # cd /usr/bin

# ln -s /usr/bin/keychain kc

  當這個解決方法起作用時,如果我們想要把兩個檔案都移到 /usr/local/bin 時,它將會出現問題。

  # mv /usr/bin/keychain

/usr/bin/kc /usr/local/bin

  因為在符號連結中,我們使用了絕對路徑,而我們的kc符號連結仍然指向/usr/bin/keychain,它已不存在了——另一個被破壞的符號連結。符號連結中的相對路徑和絕對路徑都各具優點,您應該使用適合於您的特殊應用的路徑型別。一般情況下,相對路徑或絕對路徑都能工作得很好。在這種情況下,下面的示例將起作用:

  # cd /usr/bin

# ln -s keychain kc

# ls -l kc

lrwxrwxrwx 1 root root 8 Jan 5 12:

40 kc -> keychain

  rm

  既然我們知道怎樣使用 cp、mv 和 ln,現在我們該學習怎樣把物件從檔案系統中刪除了。通常,這用 rm 命令來完成。要刪除檔案,只需在命令列中指定它們:

  $ cd /tmp

$ touch file1 file2

$ ls -l file1 file2

-rw-r--r-- 1 root root 0 Jan 1 16:41 file1

-rw-r--r-- 1 root root 0 Jan 1 16:41 file2

$ rm file1 file2

$ ls -l file1 file2

ls: file1: No such file or directory

ls: file2: No such file or directory

  rmdir

  要刪除目錄,您有兩種選擇。您可以刪除目錄中所有的物件,然後使用 rmdir 來刪除目錄本身:

  $ mkdir mydir

$ touch mydir/file1

$ rm mydir/file1

$ rmdir mydir

  rm 和目錄

  或者,您可以使用 rm 命令的 recursive force選項來告訴rm刪除您指定的目錄以及目錄中包含的所有物件:

  $ rm -rf mydir

  一般情況下,rm -rf 是刪除目錄樹的首選方法。在使用 rm -rf 時要十分小心,因為它的功能可以被很好地利用,也可能會因使用不當造成惡果。

  介紹萬用字元

  在您日常的 Linux 使用中,有很多時候您可能需要一次對多個檔案系統物件執行單一操作(比如 rm)。在這些情況下,在命令列中輸入許多檔案通常讓人感到厭煩,為了解決這個問題,您可以利用 Linux 內建的萬用字元支援。這種支援也叫做“globbing”(由於歷史原因),允許您透過使用萬用字元模式一次指定多個檔案。

  Bash 和其它 Linux 命令將透過在磁碟上查詢並找到任何與之匹配的檔案來解釋這種模式。因此,如果在當前工作目錄中,您有從 file1 到 file8 的檔案,那麼您可以輸入下面的命令來刪除這些檔案:

  $ rm file[1-8]

  或者,如果您只想要刪除檔名以 file 開頭的所有檔案,您可以輸入:

  $ rm file*

  理解不匹配

  或者,如果您想要列出 /etc 中以 g 開頭的所有檔案系統物件,您可以輸入:

  $ ls -d /etc/g*

/etc/gconf /etc/ggi /etc/gimp /etc/gnome

/etc/gnome-vfs-mime-magic /etc/gpm

/etc/group /etc/group-

  現在,如果您指定了沒有任何檔案系統物件與之匹配的模式,會怎麼樣呢?在下面的示例中,我們試圖列出 /usr/bin 中以 asdf 開頭並且以 jkl 結尾的所有檔案:

  $ ls -d /usr/bin/asdf*jkl

ls: /usr/bin/asdf*jkl:

No such file or directory

  這裡是對所發生情況的說明。通常,當我們指定一種模式時,該模式與底層系統上的一個或多個檔案匹配,bash 以空格隔開的所有匹配物件的列表來替換該模式。

  但是,當模式不能找到匹配物件時,bash 將不理會引數、萬用字元等等,保留原樣。因此,當“ls”不能找到檔案 /usr/bin/asdf*jkl 時,它會報錯。此處的有效的規則是:glob 模式只在與檔案系統中的物件匹配時才可以進行擴充套件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-940261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章