shell指令碼學習-9(ln命令學習)

來源:互聯網
上載者:User

[本文開始]

ln是一個很神奇的命令,它可以建立一個檔案的影子,也可以通過一個通道進入另一個地方。:)其實,所有的這些把戲都是通過軟串連和硬串連實現的。

我們假設你已經閱讀了“硬串連和軟串連的原理-《別怕Linux編程》之七”這篇文章,並且對其原理有比較透徹的認識。下面開始ln命令的情景舉例吧!

 

1 我想建一個source.txt檔案的永久連結,名字取做linksource.txt

[rocrocket@wupengchong test]$ cat source.txt
Hello!Source!
[rocrocket@wupengchong test]$ ll source.txt
-rw-rw-r– 1 rocrocket rocrocket 14 2008-10-23 09:25 source.txt
[rocrocket@wupengchong test]$ ln source.txt linksource.txt
[rocrocket@wupengchong test]$ ll -i source.txt linksource.txt
1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 linksource.txt
1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

可以看到,我們建立永久連結的命令格式是“ln 目標 連結名稱”,我們用ln source.txt linksource.txt來建立了一個source.txt檔案的永久連結。之後,我們用ll -i,即ls -li命令來查看了檔案的資訊,其中-i選項表示列出每個檔案的inode節點ID,我們可以發現source.txt和linksource.txt的inode號是完全一樣的,都是1178119,這就說明它們都指向同一個資料區塊。這就是永久連結。

但要注意,永久連結不允許跨分區來建立,也就是不允許跨檔案系統來建立,即使是同一類型的檔案系統也是不行的。所以永久連結只能在一個分區內建立。

2 我想建立一個source.txt檔案的軟連結,名字叫做softsource。

[rocrocket@wupengchong test]$ ln -s source.txt softsource
[rocrocket@wupengchong test]$ ll -i source.txt softsource
1178211 lrwxrwxrwx 1 rocrocket rocrocket 10 2008-10-23 09:32 softsource -> source.txt
1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

可以看到,建立軟連結也是使用ln命令,但是必須加上-s選項,建立軟連結的命令格式為“ln -s 目標 連結名稱”。之後我們可以使用ls命令可以查看到軟連結softsource和source.txt的inode號是不一樣的,這說明他們完全指向兩個不同的資料庫快。而且,細心的朋友能夠觀察到軟連結檔案的許可權欄首字元為l,這也是軟鏈區別於普通檔案的地方之一。

如果這個時候,我們刪除了source.txt檔案,則軟連結softsource就會編程紅色字型,這表示警告,這是一個有問題的檔案,它無法找到它所標識的檔案source.txt了。

3 剛才的兩個例子都是連結檔案的,那連結目錄呢,我想試試!

[rocrocket@wupengchong test]$ ln tempdir linkdir
ln: `temp’: hard link not allowed for directory

我想永久連結一個目錄tempdir,但是報錯了!是的,永久連結是不允許連結到目錄的。(待會兒來分析原因,少安毋躁)

[rocrocket@wupengchong test]$ ln -s temp linkdir

目錄的軟連結的建立是允許的,看,我建立了一個temp目錄的軟連結linkdir,以後我完全可以cd linkdir來進入temp目錄了。像這樣:

[rocrocket@wupengchong test]$ cd linkdir/
[rocrocket@wupengchong linkdir]$ ls
a001.txt  a002.c  a.out  sixunhuan.c
[rocrocket@wupengchong linkdir]$ cd ../temp/
[rocrocket@wupengchong temp]$ ls
a001.txt  a002.c  a.out  sixunhuan.c
[rocrocket@wupengchong temp]$

我們來查看下這兩個目錄的屬性資訊:

[rocrocket@wupengchong test]$ ll|grep -E “temp|linkdir”
lrwxrwxrwx 1 rocrocket rocrocket     4 2008-10-23 09:49 linkdir -> temp
drwxr-xr-x 2 rocrocket rocrocket  4096 2008-08-07 16:08 temp

可以看到linkdir是軟連結,而temp是一個目錄。

4 為什麼ln不允許永久連結到目錄,而允許軟連結到目錄呢?

這個問題,我在網上找到了很好的解答。這位朋友解釋的很清晰。(我實在無法找到如下文章的出處以及原作者資訊,故無法標識原作者資訊,如有知情者,可速與我聯絡,我會及時加入作者資訊。謝謝)

“linux系統中的硬串連有兩個限制:不能跨越檔案系統和不允許普通使用者對目錄作硬串連。至於第一個限制,很好理解,而第二個就不那麼好理解了。 我們對任何一個目錄用ls -l 命令都可以看到其串連數至少是2,這也說明了系統中是存在硬串連的,而且命令ln -d 也可以讓超級使用者對目錄作硬串連,這些都說明了系統限制對目錄進行硬串連只是一個硬性規定,並不是邏輯上不允許或技術上的不可行。那麼作業系統為什麼要進行限制呢?

如果引入了對目錄的硬串連就有可能在目錄中引入迴圈,那麼在目錄遍曆的時候系統就會陷入無限迴圈當中。也許您會說,符號串連不也可以引入迴圈嗎,那麼為什麼不限制目錄的符號串連呢?原因就在於在linux系統中,每個檔案(目錄也是檔案)都對應著一個inode結構,其中inode資料結構中包含了檔案類型(目錄,普通檔案,符號串連檔案等等)的資訊,也就是說作業系統在遍曆目錄時可以判斷出符號串連,既然可以判斷出符號串連當然就可以採取一些措施來防範進入過大的迴圈了,系統在連續遇到8個符號串連後就停止遍曆,這就是為什麼對目錄符號串連不會進入死迴圈的原因了。但是對於硬串連,由於作業系統中採用的資料結構和演算法限制,目前是不能防範這種死迴圈的。”

5 ln命令裡面有一個-n選項,它的官方解釋是這樣的:-n, –no-dereference  treat destination that is a symlink to a directory as if it were a normal file. 請問這是什麼意思阿?

在水木上有類似的一個文章,jianingy給出了一個清晰的例子,如下:

第一步:mkdir a b
第二步:ln -sf a c (這個時候c -> a)
第三步:如果執行ln -sf b c,那麼會在c目錄“裡面”建立一個b的symbolic link,但很明顯這不是你的本意。
如果把第三步替換成:ln -snf b c 那麼結果就變成了c->b

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.