<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 6.1 目錄與路徑 由前一章[Linux的文件權限與目錄配置](../Text/index.html)中通過FHS了解了Linux的“樹狀目錄”概念之后, 接下來就得要實際的來搞定一些基本的路徑問題了!這些目錄的問題當中,最重要的莫過于前一章也談過的[“絕對路徑”與“相對路徑”](../Text/index.html#dir_path)的意義啦! 絕對/相對路徑的寫法并不相同,要特別注意。此外,當你下達指令時,該指令是通過什么功能來取得的? 這與PATH這個變量有關呢!下面就讓我們來談談啰! ### 6.1.1 相對路徑與絕對路徑 在開始目錄的切換之前,你必須要先了解一下所謂的“路徑(PATH)”, 有趣的是:什么是“相對路徑”與“絕對路徑”? 雖然前一章已經稍微針對這個議題提過一次,不過,這里不厭其煩的再次的強調一下! * 絕對路徑:路徑的寫法“一定由根目錄 / 寫起”,例如: /usr/share/doc 這個目錄。 * 相對路徑:路徑的寫法“不是由 / 寫起”,例如由 /usr/share/doc 要到 /usr/share/man 下面時,可以寫成: “cd ../man”這就是相對路徑的寫法啦!相對路徑意指“相對于目前工作目錄的路徑!” * 相對路徑的用途 那么相對路徑與絕對路徑有什么了不起呀?喝!那可真的是了不起了!假設你寫了一個軟件, 這個軟件共需要三個目錄,分別是 etc, bin, man 這三個目錄,然而由于不同的人喜歡安裝在不同的目錄之下, 假設甲安裝的目錄是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ,不過乙卻喜歡安裝在 /home/packages/etc, /home/packages/bin, /home/packages/man 這三個目錄中,請問如果需要用到絕對路徑的話,那么是否很麻煩呢?是的! 如此一來每個目錄下的東西就很難對應的起來!這個時候相對路徑的寫法就顯的特別的重要了! 此外,如果你跟鳥哥一樣,喜歡將路徑的名字寫的很長,好讓自己知道那個目錄是在干什么的,例如: /cluster/raid/output/taiwan2006/smoke 這個目錄,而另一個目錄在 /cluster/raid/output/taiwan2006/cctm ,那么我從第一個要到第二個目錄去的話,怎么寫比較方便? 當然是“ cd ../cctm ”比較方便啰!對吧! * 絕對路徑的用途 但是對于文件名的正確性來說,“絕對路徑的正確度要比較好~”。 一般來說,鳥哥會建議你,如果是在寫程序 (shell scripts) 來管理系統的條件下,務必使用絕對路徑的寫法。 怎么說呢?因為絕對路徑的寫法雖然比較麻煩,但是可以肯定這個寫法絕對不會有問題。 如果使用相對路徑在程序當中,則可能由于你執行的工作環境不同,導致一些問題的發生。 這個問題在[工作調度(at, cron, 第十五章)](../Text/index.html)當中尤其重要!這個現象我們在[十二章、shell script](../Text/index.html)時,會再次的提醒你喔! ^_^ ### 6.1.2 目錄的相關操作 我們之前稍微提到變換目錄的指令是cd,還有哪些可以進行目錄操作的指令呢? 例如創建目錄啊、刪除目錄之類的~還有,得要先知道的,就是有哪些比較特殊的目錄呢? 舉例來說,下面這些就是比較特殊的目錄,得要用力的記下來才行: ``` . 代表此層目錄 .. 代表上一層目錄 - 代表前一個工作目錄 ~ 代表“目前使用者身份”所在的主文件夾 ~account 代表 account 這個使用者的主文件夾(account是個帳號名稱) ``` 需要特別注意的是:在所有目錄下面都會存在的兩個目錄,分別是“.”與“..” 分別代表此層與上層目錄的意思。那么來思考一下下面這個例題: 例題:請問在Linux下面,根目錄下有沒有上層目錄(..)存在?答:若使用“ ls -al / ”去查詢,可以看到根目錄下確實存在 . 與 .. 兩個目錄,再仔細的查閱, 可發現這兩個目錄的屬性與權限完全一致,這代表根目錄的上一層(..)與根目錄自己(.)是同一個目錄。 下面我們就來談一談幾個常見的處理目錄的指令吧: * cd:變換目錄 * pwd:顯示目前的目錄 * mkdir:創建一個新的目錄 * rmdir:刪除一個空的目錄 * cd (change directory, 變換目錄) 我們知道dmtsai這個使用者的主文件夾是/home/dmtsai/,而root主文件夾則是/root/,假設我以root身份在 Linux系統中,那么簡單的說明一下這幾個特殊的目錄的意義是: ``` [dmtsai@study ~]$ su - # 先切換身份成為 root 看看! [root@study ~]# cd [相對路徑或絕對路徑] # 最重要的就是目錄的絕對路徑與相對路徑,還有一些特殊目錄的符號啰! [root@study ~]# cd ~dmtsai # 代表去到 dmtsai 這個使用者的主文件夾,亦即 /home/dmtsai [root@study dmtsai]# cd ~ # 表示回到自己的主文件夾,亦即是 /root 這個目錄 [root@study ~]# cd # 沒有加上任何路徑,也還是代表回到自己主文件夾的意思喔! [root@study ~]# cd .. # 表示去到目前的上層目錄,亦即是 /root 的上層目錄的意思; [root@study /]# cd - # 表示回到剛剛的那個目錄,也就是 /root 啰~ [root@study ~]# cd /var/spool/mail # 這個就是絕對路徑的寫法!直接指定要去的完整路徑名稱! [root@study mail]# cd ../postfix # 這個是相對路徑的寫法,我們由/var/spool/mail 去到/var/spool/postfix 就這樣寫! ``` cd是Change Directory的縮寫,這是用來變換工作目錄的指令。注意,目錄名稱與cd指令之間存在一個空格。 一登陸Linux系統后,每個帳號都會在自己帳號的主文件夾中。那回到上一層目錄可以用“ cd .. ”。 利用相對路徑的寫法必須要確認你目前的路徑才能正確的去到想要去的目錄。例如上表當中最后一個例子, 你必須要確認你是在/var/spool/mail當中,并且知道在/var/spool當中有個mqueue的目錄才行啊~ 這樣才能使用cd ../postfix 去到正確的目錄說,否則就要直接輸入cd /var/spool/postfix 啰~ 其實,我們的提示字符,亦即那個 [root@study ~]# 當中,就已經有指出目前的目錄了, 剛登陸時會到自己的主文件夾,而主文件夾還有一個代碼,那就是“ ~ ”符號! 例如上面的例子可以發現,使用“ cd ~ ”可以回到個人的主文件夾里頭去呢! 另外,針對 cd 的使用方法,如果僅輸入 cd 時,代表的就是“ cd ~ ”的意思喔~ 亦即是會回到自己的主文件夾啦!而那個“ cd - ”比較難以理解,請自行多做幾次練習,就會比較明白了。 ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 還是要一再地提醒,我們的 Linux 的默認命令行界面 (bash shell) 具有文件補齊功能, 你要常常利用 [tab] 按鍵來達成你的目錄完整性啊!這可是個好習慣啊~可以避免你按錯鍵盤輸入錯字說~ ^_^ * pwd (顯示目前所在的目錄) ``` [root@study ~]# pwd [-P] 選項與參數: -P :顯示出確實的路徑,而非使用鏈接 (link) 路徑。 范例:單純顯示出目前的工作目錄: [root@study ~]# pwd /root &lt;== 顯示出目錄啦~ 范例:顯示出實際的工作目錄,而非鏈接文件本身的目錄名而已 [root@study ~]# cd /var/mail &lt;==注意,/var/mail是一個鏈接文件 [root@study mail]# pwd /var/mail &lt;==列出目前的工作目錄 [root@study mail]# pwd -P /var/spool/mail &lt;==怎么回事?有沒有加 -P 差很多~ [root@study mail]# ls -ld /var/mail lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -&gt; spool/mail # 看到這里應該知道為啥了吧?因為 /var/mail 是鏈接文件,鏈接到 /var/spool/mail # 所以,加上 pwd -P 的選項后,會不以鏈接文件的數據顯示,而是顯示正確的完整路徑啊! ``` pwd是Print Working Directory的縮寫,也就是顯示目前所在目錄的指令, 例如在上個表格最后的目錄是/var/mail這個目錄,但是提示字符僅顯示mail, 如果你想要知道目前所在的目錄,可以輸入pwd即可。此外,由于很多的套件所使用的目錄名稱都相同,例如 /usr/local/etc還有/etc,但是通常Linux僅列出最后面那一個目錄而已,這個時候你就可以使用pwd 來知道你的所在目錄啰!免得搞錯目錄,結果... 其實有趣的是那個 -P 的選項啦!他可以讓我們取得正確的目錄名稱,而不是以鏈接文件的路徑來顯示的。 如果你使用的是CentOS 7.x的話,剛剛好/var/mail是/var/spool/mail的鏈接文件, 所以,通過到/var/mail下達pwd -P就能夠知道這個選項的意義啰~ ^_^ * mkdir (創建新目錄) ``` [root@study ~]# mkdir [-mp] 目錄名稱 選項與參數: -m :設置文件的權限喔!直接設置,不需要看默認權限 (umask) 的臉色~ -p :幫助你直接將所需要的目錄(包含上層目錄)遞回創建起來! 范例:請到/tmp下面嘗試創建數個新目錄看看: [root@study ~]# cd /tmp [root@study tmp]# mkdir test &lt;==創建一名為 test 的新目錄 [root@study tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory # 話說,系統告訴我們,沒可能創建這個目錄啊!就是沒有目錄才要創建的!見鬼嘛? [root@study tmp]# mkdir -p test1/test2/test3/test4 # 原來是要建 test4 上層沒先建 test3 之故!加了這個 -p 的選項,可以自行幫你創建多層目錄! 范例:創建權限為rwx--x--x的目錄 [root@study tmp]# mkdir -m 711 test2 [root@study tmp]# ls -ld test* drwxr-xr-x. 2 root root 6 Jun 4 19:03 test drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 drwx--x--x. 2 root root 6 Jun 4 19:05 test2 # 仔細看上面的權限部分,如果沒有加上 -m 來強制設置屬性,系統會使用默認屬性。 # 那么你的默認屬性為何?這要通過下面介紹的 [umask](../Text/index.html#umask) 才能了解喔! ^_^ ``` 如果想要創建新的目錄的話,那么就使用mkdir (make directory)吧! 不過,在默認的情況下, 你所需要的目錄得一層一層的創建才行!例如:假如你要創建一個目錄為 /home/bird/testing/test1,那么首先必須要有 /home 然后 /home/bird ,再來 /home/bird/testing 都必須要存在,才可以創建 /home/bird/testing/test1 這個目錄!假如沒有 /home/bird/testing 時,就沒有辦法創建 test1 的目錄啰! 不過,現在有個更簡單有效的方法啦!那就是加上 -p 這個選項喔!你可以直接下達:“ mkdir -p /home/bird/testing/test1 ” 則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的創建起目錄!并且, 如果該目錄本來就已經存在時,系統也不會顯示錯誤訊息喔!挺快樂的吧! ^_^。 不過鳥哥不建議常用-p這個選項,因為擔心如果你打錯字,那么目錄名稱就會變的亂七八糟的! 另外,有個地方你必須要先有概念,那就是“默認權限”的地方。我們可以利用 -m 來強制給予一個新的目錄相關的權限, 例如上表當中,我們給予 -m 711 來給予新的目錄 drwx--x--x 的權限。不過,如果沒有給予 -m 選項時, 那么默認的新建目錄權限又是什么呢?這個跟 [umask](../Text/index.html#umask) 有關,我們在本章后頭會加以介紹的。 * rmdir (刪除“空”的目錄) ``` [root@study ~]# rmdir [-p] 目錄名稱 選項與參數: -p :連同“上層”“空的”目錄也一起刪除 范例:將于mkdir范例中創建的目錄(/tmp下面)刪除掉! [root@study tmp]# ls -ld test* &lt;==看看有多少目錄存在? drwxr-xr-x. 2 root root 6 Jun 4 19:03 test drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 drwx--x--x. 2 root root 6 Jun 4 19:05 test2 [root@study tmp]# rmdir test &lt;==可直接刪除掉,沒問題 [root@study tmp]# rmdir test1 &lt;==因為尚有內容,所以無法刪除! rmdir: failed to remove ‘test1’: Directory not empty [root@study tmp]# rmdir -p test1/test2/test3/test4 [root@study tmp]# ls -ld test* &lt;==您看看,下面的輸出中test與test1不見了! drwx--x--x. 2 root root 6 Jun 4 19:05 test2 # 瞧!利用 -p 這個選項,立刻就可以將 test1/test2/test3/test4 一次刪除~ # 不過要注意的是,這個 rmdir 僅能“刪除空的目錄”喔! ``` 如果想要刪除舊有的目錄時,就使用rmdir吧!例如將剛剛創建的test殺掉,使用“ rmdir test ”即可!請注意呦!目錄需要一層一層的刪除才行!而且被刪除的目錄里面必定不能存在其他的目錄或文件! 這也是所謂的空的目錄(empty directory)的意思啊!那如果要將所有目錄下的東西都殺掉呢?! 這個時候就必須使用“ rm -r test ”啰!不過,還是使用 rmdir 比較不危險!你也可以嘗試以 -p 的選項加入,來刪除上層的目錄喔! ### 6.1.3 關于可執行文件路徑的變量: $PATH 經過前一章FHS的說明后,我們知道查閱文件屬性的指令ls完整文件名為:/bin/ls(這是絕對路徑), 那你會不會覺得很奇怪:“為什么我可以在任何地方執行/bin/ls這個指令呢? ” 為什么我在任何目錄下輸入 ls 就一定可以顯示出一些訊息而不會說找不到該 /bin/ls 指令呢? 這是因為環境變量 PATH 的幫助所致呀! 當我們在執行一個指令的時候,舉例來說“ls”好了,系統會依照PATH的設置去每個PATH定義的目錄下搜尋文件名為ls的可可執行文件, 如果在PATH定義的目錄中含有多個文件名為ls的可可執行文件,那么先搜尋到的同名指令先被執行! 現在,請下達“echo $PATH”來看看到底有哪些目錄被定義出來了? echo有“顯示、印出”的意思,而 PATH 前面加的 $ 表示后面接的是變量,所以會顯示出目前的 PATH ! ``` 范例:先用root的身份列出搜尋的路徑為何? [root@study ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 范例:用dmtsai的身份列出搜尋的路徑為何? [root@study ~]# exit # 由之前的 su - 離開,變回原本的帳號!或再取得一個終端機皆可! [dmtsai@study ~]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin # 記不記得我們前一章說過,目前 /bin 是鏈接到 /usr/bin 當中的喔! ``` PATH(一定是大寫)這個變量的內容是由一堆目錄所組成的,每個目錄中間用冒號(:)來隔開, 每個目錄是有“順序”之分的。仔細看一下上面的輸出,你可以發現到無論是root還是dmtsai都有 /bin 或 /usr/bin 這個目錄在PATH變量內,所以當然就能夠在任何地方執行ls來找到/bin/ls可執行文件啰!因為 /bin 在 CentOS 7 當中,就是鏈接到 /usr/bin 去的! 所以這兩個目錄內容會一模一樣! 我們用幾個范例來讓你了解一下,為什么PATH是那么重要的項目! 例題:假設你是root,如果你將ls由/bin/ls移動成為/root/ls(可用“mv /bin/ls /root”指令達成),然后你自己本身也在/root目錄下, 請問(1)你能不能直接輸入ls來執行?(2)若不能,你該如何執行ls這個指令?(3)若要直接輸入ls即可執行,又該如何進行?答:由于這個例題的重點是將某個可執行文件移動到非正規目錄去,所以我們先要進行下面的動作才行:(務必先使用 su - 切換成為root的身份) ``` [root@study ~]# mv /bin/ls /root # mv 為移動,可將文件在不同的目錄間進行移動作業 ``` (1)接下來不論你在那個目錄下面輸入任何與ls相關的指令,都沒有辦法順利的執行ls了! 也就是說,你不能直接輸入ls來執行,因為/root這個目錄并不在PATH指定的目錄中, 所以,即使你在/root目錄下,也不能夠搜尋到ls這個指令! (2)因為這個ls確實存在于/root下面,并不是被刪除了!所以我們可以通過使用絕對路徑或者是相對路徑直接指定這個可執行文件文件名, 下面的兩個方法都能夠執行ls這個指令: ``` [root@study ~]# /root/ls &lt;==直接用絕對路徑指定該文件名 [root@study ~]# ./ls &lt;==因為在 /root 目錄下,就用./ls來指定 ``` (3)如果想要讓root在任何目錄均可執行/root下面的ls,那么就將/root加入PATH當中即可。 加入的方法很簡單,就像下面這樣: ``` [root@study ~]# PATH="${PATH}:/root" ``` 上面這個作法就能夠將/root加入到可執行文件搜尋路徑PATH中了!不相信的話請您自行使用“echo $PATH”去查看吧! 另外,除了 $PATH 之外,如果想要更明確的定義出變量的名稱,可以使用大括號 ${PATH} 來處理變量的調用喔! 如果確定這個例題進行沒有問題了,請將ls搬回/bin下面,不然系統會掛點的! ``` [root@study ~]# mv /root/ls /bin ``` 某些情況下,即使你已經將 ls 搬回 /bin 了,不過系統還是會告知你無法處理 /root/ls 喔!很可能是因為指令參數被高速緩存的關系。 不要緊張,只要登出 (exit) 再登陸 (su -) 就可以繼續快樂的使用 ls 了! 例題:如果我有兩個ls指令在不同的目錄中,例如/usr/local/bin/ls與/bin/ls那么當我下達 ls 的時候,哪個ls會被執行?答:那還用說,就找出 ${PATH} 里面哪個目錄先被查詢,則那個目錄下的指令就會被先執行了!所以用 dmtsai 帳號為例,他最先搜尋的是 /usr/local/bin, 所以 /usr/local/bin/ls 會先被執行喔! 例題:為什么 ${PATH} 搜尋的目錄不加入本目錄(.)?加入本目錄的搜尋不是也不錯?答:如果在PATH中加入本目錄(.)后,確實我們就能夠在指令所在目錄進行指令的執行了。 但是由于你的工作目錄并非固定(常常會使用cd來切換到不同的目錄), 因此能夠執行的指令會有變動(因為每個目錄下面的可可執行文件都不相同嘛!),這對使用者來說并非好事。 另外,如果有個壞心使用者在/tmp下面做了一個指令,因為/tmp是大家都能夠寫入的環境,所以他當然可以這樣做。 假設該指令可能會竊取使用者的一些數據,如果你使用root的身份來執行這個指令,那不是很糟糕? 如果這個指令的名稱又是經常會被用到的ls時,那“中標”的概率就更高了! 所以,為了安全起見,不建議將“.”加入PATH的搜尋目錄中。 而由上面的幾個例題我們也可以知道幾件事情: * 不同身份使用者默認的PATH不同,默認能夠隨意執行的指令也不同(如root與dmtsai); * PATH是可以修改的; * 使用絕對路徑或相對路徑直接指定某個指令的文件名來執行,會比搜尋PATH來的正確; * 指令應該要放置到正確的目錄下,執行才會比較方便; * 本目錄(.)最好不要放到PATH當中。 對于PATH更詳細的“變量”說明,我們會在第三篇的[bash shell](../Text/index.html)中詳細說明的!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看