Linux Bash Shell絕對路徑與相對路徑
其實,在使用 Linux Bash Shell還有另一個困擾,就是當你的 PATH 沒有設定完整的時候,下達指令都是要以『一長列的指令連帶根目錄都要列出來』,呵呵那就是絕對路徑的設定法啦!基本上,這個『絕對路徑』與『相對路徑』的觀念是很重要的!否則你將常常會找不到檔案說!
所謂的『絕對路徑』就是以根目錄開始寫入到檔案的一種命令寫定方法,舉例來說,我目前在 /home/test 這個 test 使用者的家目錄中,我想要看看里面的 .bashrc 這個檔案的資料,使用的是 more 這個指令,而這個指令在 /bin/more 當中,則正確的下達指令的方法為:
[test @tset test]# /bin/more .bashrc <==我在的目錄為 /home/test !這是絕對路徑寫法!
而如果你還記得我們在 檔案系統指令 那一篇文章中提到的觀念的話,那么應該記得使用 ls -al 時會出現兩個一定存在的目錄,分別是『.』與『..』,分別代表是『這個路徑』,與『上一層路徑』!
[test @tset test]# ls -al
total 728
drwx------3 vbirdvbird4096 May 19 14:53 . <==這一層路徑的屬性說明
drwxr-xr-x3 root root 4096 May 5 16:50 .. <==上一層路徑的屬性說明
以下略!
所以說,要執行上一層目錄中的命令,可以下達『 cd ../command 』那個 command 指的是存在的可執行檔!那么我因為在 /home/test 里面,距離 /bin 有兩層上層目錄,所以我要使用 /bin/more 這個執行檔,并且使用相對路徑的方法,就必須使用:
[test @tset test]# ../../bin/more .bashrc<==一層一層回到根目錄,在進入 /bin 的寫法!相對路徑
這種相對路徑的方法相當廣泛的被運用于 script 當中,這是因為如前面提到的,每個人的安裝預設的目錄都不相同,則使用相對路徑的話,很容易就可以找到套件之間相依軟體或者是設定檔案的相關性!
關于Linux Bash Shell路徑搜尋的問題!為何不執行目前所在目錄下的檔案?咦!剛剛不是提到『.』與『..』嗎?那么那個『 . 』是干嘛用的?!眼尖的朋友應該已經發現了,就是『我在執行檔案的時候,基本上,并不會主動搜尋目前目錄下的檔案』舉個例子來說,我安裝的 squid 這個執行檔在 /usr/local/squid/bin/squid 這個檔案,然而我在 /usr/local/squid/bin 下達 squid 的時候,系統會告訴你『查不到這個檔案!』真是見鬼了!明明有這個檔案的呀!這是因為系統預設的 PATH (路徑)并沒有執行目前目錄下的設定,也就是『.』這個路徑!你可以使用『 echo $PATH 』看看,就可以知道為什么了!那么為何不要設定這個路徑呢?這是因為『安全』的考量。
由于系統預設是允許任何人在 /tmp 底下寫入任何檔案的,那么萬一有居心不良的使用者或者是 Cracker 入侵你的電腦,并在你的 /tmp 里頭埋了一個小木馬,并取名為 ls ,好了,改天你以 root 身份登入后,到 /tmp 底下,并執行 ls ,你看會有什么結果?!這個 /tmp/ls 由其他身份的人來執行或許沒有問題,但是由 root 來執行卻可能會導致 Cracker 所樂意見到的結果!那曉得為何了吧?!當然啰!您還是可以選擇在 ~/.bashrc 當中設定你的 . 在你的 PATH 當中,不過并不這么建議就是了!
好了,由于系統預設并不主動搜尋目前目錄下的執行檔,那么你應該如何執行『目前目錄下的執行檔』呢?很簡單呀!就是以相對路徑的觀念,由于『 .. 』是上層,而『 . 』是這一層,所以要執行這一層目錄的命令就使用『 ./command 』即可!例如你的 /usr/local/squid/bin 底下執行 squid 則可以寫成:
[test @tset bin]# ./squid <==以相對路徑的觀念來看!在本目錄下達的指令寫法!
請特別留意這方面的問題!『新手特別容易犯這個錯誤呢!』
【編輯推薦】