絕對路徑與相對路徑
其實,在使用 bash 還有另外一個困擾,就是當你的 PATH 沒有設定完整的時候,下達指令都是要以『一長列的指令連帶根目錄都要列出來』,呵呵那就是絕對路徑的設定法啦!基本上,這個『絕對路徑』與『相對路徑』的觀念是很重要的!不然你將經常會找不到檔案說!所謂的『絕對路徑』就是以根目錄開始寫入到檔案的一種命令寫定方法,舉例來講,我目前在 /home/test 這個 test 使用者的家目錄中,我想要看看裏面的 .bashrc 這個檔案的數據,使用的是 more 這個指令,而這個指令在 /bin/more 當中,則正確的下達指令的方法爲:
[test @tset test]# /bin/more .bashrc<==我在的目錄爲 /home/test !這是絕對路徑寫法!
我在的目錄爲 /home/test !這是絕對路徑寫法! 而若是你還記得咱們在 檔案系統指令 那一篇文章中提到的觀念的話,那麼應該記得使用 ls -al 時會出現兩個必定存在的目錄,分別是『.』與『..』,分別表明是『這個路徑』,與『上一層路徑』!
[test @tset test]# ls -al
total 728
drwx------ 3 vbird vbird 4096 May 19 14:53 . <==這一層路徑的屬性說明
drwxr-xr-x 3 root root 4096 May 5 16:50 .. <==上一層路徑的屬性說明
如下略!
因此說,要執行上一層目錄中的命令,能夠下達『../command 』那個 command 指的是存在的可執行檔!那麼我由於在 /home/test 裏面,距離 /bin 有兩層上層目錄,因此我要使用 /bin/more 這個執行文件,而且使用相對路徑的方法,就必須使用:
[test @tset test]# ../../bin/more .bashrc <==一層一層回到根目錄,在進入 /bin 的寫法!相對路徑
這種相對路徑的方法至關普遍的被運用於 script 當中,這是由於如前面提到的,每一個人的安裝預設的目錄都不相同,則使用相對路徑的話,很容易就能夠找到套件之間相依軟件或者是設定檔案的相關性!
關於路徑搜尋的問題!爲什麼不執行目前所在目錄下的檔案?
咦!剛剛不是提到『.』與『..』嗎?那麼那個『 . 』是幹嗎用的?!眼尖的朋友應該已經發現了,就是『我在執行檔案的時候,基本上,並不會主動搜尋目前目錄下的檔案』舉個例子來講,我安裝的 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 <==以相對路徑的觀念來看!在本目錄下達的指令寫法!
請特別留意這方面的問題!『新手特別容易犯這個錯誤呢!』bash