sh 與 ./ - Linux

By Cara
at 2011-08-30T11:04
at 2011-08-30T11:04
Table of Contents
當我們打一個指令,譬如 ls
這個指令其實是某個可執行檔案,系統去找到它,並且執行它
那這個 ls 在哪裡?
你可以輸入「whereis ls」發現它放在 /bin/ls 底下
問題是…系統又怎麼知道,當你打 ls 的時候,你指的是 /bin/ls 這個東西
而不是 /home/xxx/ls 或者 /root/ls 呢?
這件事就是由「環境變數」的「PATH」所決定的
你可以打「echo $PATH」來看到結果
在我的電腦裡,出現的東西是這樣的:
「/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin」
因此,當我們輸入ls時,系統其實會依序這樣做:
(1) 看看 /usr/local/sbin/ls 存不存在?不存在,所以無法執行
(2) 看看 /usr/local/bin/ls 存不存在?不存在,所以無法執行
(3) 看看 /usr/sbin/ls 存不存在?不存在,所以無法執行
(4) 看看 /usr/bin/ls 存不存在?不存在,所以無法執行
(5) 看看 /sbin/ls 存不存在?不存在,所以無法執行
(6) 看看 /bin/ls 存不存在?這次有了,所以執行這個
重要的是:
這個規則是當我們「想執行一個檔案」的時候,才會這麼找
如果你只是想看一個檔案的內容,譬如 cat configure
那個 cat 會從環境變數裡找到,但 configure 就會直接拿「當下目錄的那個檔案」
所以 cat configure 跟 cat ./configure 同義,但不必那樣寫
回到你的問題,為什麼必須要打 ./configure 呢?
如果只有打 configure 的話會發生什麼事?
同上面的 ls, 它會從 PATH 裡面,一個一個去找「configure」,依我的電腦為例:
(1) 看看 /usr/local/sbin/configure 存不存在?不存在,所以無法執行
(2) 看看 /usr/local/bin/configure 存不存在?不存在,所以無法執行
(3) 看看 /usr/sbin/configure 存不存在?不存在,所以無法執行
(4) 看看 /usr/bin/configure 存不存在?不存在,所以無法執行
(5) 看看 /sbin/configure 存不存在?不存在,所以無法執行
(6) 看看 /bin/configure 存不存在?還是不存在,所以無法執行(呼,好累)
所以最後只會得到一個「configure: Command not found.」的執行結果
./ 的解釋就是「現在這個目錄下」,也就是 pwd 這個指令印出來的
因此 ./configure 就是「現在這個目錄下的 configure」
明確的告訴 Linux:「你不用管 PATH 寫什麼,反正我就是要執行這個」
有個做法,你可以把 ./ 這個目錄也加入 PATH 裡面
這樣子直接打 configure,系統就會多嘗試一個 ./configure
不過不建議這麼做,鳥哥那邊有解釋,我就不多說了(打字好累)
還有另一個更不建議的做法:你可以 cp configure /bin (需要root權限)
這樣打 configure 就可以找到那個 /bin/configure 了
再次提醒,這只是舉例,實際上請不要這麼做,原因您可以想想看
至於 sh configure 又是什麼?
sh 是另一隻可以執行的程式,用「whereis sh」可以知道,它位於「/bin/sh」
因此我們不需要打 ./sh,系統就可以根據 PATH 找到 sh 在哪裡
sh 後面可以接一個檔案,代表「我要執行這個檔案的內容」
就像 cat 後面可以接一個檔案,代表「我要顯示這個檔案的內容」
又如上述「重要的是」那段,當我們打 sh configure 的時候
系統會知道那個 configure 就是目前目錄的 configure
所以你要寫成 sh ./configure 其實也是可以的,意義完全一樣
ls -al configure 可以發現它有 x 標記,它是個可執行檔
所以可以直接執行它,或者交由 sh 來執行它
你可以試著輸入「chmod -x configure」把 x 標記消掉(感謝Holocaust123板友補充)
這樣就變成只能用 sh configure 執行,而不能用 ./configure 執行了
--
這個指令其實是某個可執行檔案,系統去找到它,並且執行它
那這個 ls 在哪裡?
你可以輸入「whereis ls」發現它放在 /bin/ls 底下
問題是…系統又怎麼知道,當你打 ls 的時候,你指的是 /bin/ls 這個東西
而不是 /home/xxx/ls 或者 /root/ls 呢?
這件事就是由「環境變數」的「PATH」所決定的
你可以打「echo $PATH」來看到結果
在我的電腦裡,出現的東西是這樣的:
「/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin」
因此,當我們輸入ls時,系統其實會依序這樣做:
(1) 看看 /usr/local/sbin/ls 存不存在?不存在,所以無法執行
(2) 看看 /usr/local/bin/ls 存不存在?不存在,所以無法執行
(3) 看看 /usr/sbin/ls 存不存在?不存在,所以無法執行
(4) 看看 /usr/bin/ls 存不存在?不存在,所以無法執行
(5) 看看 /sbin/ls 存不存在?不存在,所以無法執行
(6) 看看 /bin/ls 存不存在?這次有了,所以執行這個
重要的是:
這個規則是當我們「想執行一個檔案」的時候,才會這麼找
如果你只是想看一個檔案的內容,譬如 cat configure
那個 cat 會從環境變數裡找到,但 configure 就會直接拿「當下目錄的那個檔案」
所以 cat configure 跟 cat ./configure 同義,但不必那樣寫
回到你的問題,為什麼必須要打 ./configure 呢?
如果只有打 configure 的話會發生什麼事?
同上面的 ls, 它會從 PATH 裡面,一個一個去找「configure」,依我的電腦為例:
(1) 看看 /usr/local/sbin/configure 存不存在?不存在,所以無法執行
(2) 看看 /usr/local/bin/configure 存不存在?不存在,所以無法執行
(3) 看看 /usr/sbin/configure 存不存在?不存在,所以無法執行
(4) 看看 /usr/bin/configure 存不存在?不存在,所以無法執行
(5) 看看 /sbin/configure 存不存在?不存在,所以無法執行
(6) 看看 /bin/configure 存不存在?還是不存在,所以無法執行(呼,好累)
所以最後只會得到一個「configure: Command not found.」的執行結果
./ 的解釋就是「現在這個目錄下」,也就是 pwd 這個指令印出來的
因此 ./configure 就是「現在這個目錄下的 configure」
明確的告訴 Linux:「你不用管 PATH 寫什麼,反正我就是要執行這個」
有個做法,你可以把 ./ 這個目錄也加入 PATH 裡面
這樣子直接打 configure,系統就會多嘗試一個 ./configure
不過不建議這麼做,鳥哥那邊有解釋,我就不多說了(打字好累)
還有另一個更不建議的做法:你可以 cp configure /bin (需要root權限)
這樣打 configure 就可以找到那個 /bin/configure 了
再次提醒,這只是舉例,實際上請不要這麼做,原因您可以想想看
至於 sh configure 又是什麼?
sh 是另一隻可以執行的程式,用「whereis sh」可以知道,它位於「/bin/sh」
因此我們不需要打 ./sh,系統就可以根據 PATH 找到 sh 在哪裡
sh 後面可以接一個檔案,代表「我要執行這個檔案的內容」
就像 cat 後面可以接一個檔案,代表「我要顯示這個檔案的內容」
又如上述「重要的是」那段,當我們打 sh configure 的時候
系統會知道那個 configure 就是目前目錄的 configure
所以你要寫成 sh ./configure 其實也是可以的,意義完全一樣
ls -al configure 可以發現它有 x 標記,它是個可執行檔
所以可以直接執行它,或者交由 sh 來執行它
你可以試著輸入「chmod -x configure」把 x 標記消掉(感謝Holocaust123板友補充)
這樣就變成只能用 sh configure 執行,而不能用 ./configure 執行了
--
Tags:
Linux
All Comments

By Adele
at 2011-08-31T19:52
at 2011-08-31T19:52

By Victoria
at 2011-09-04T15:42
at 2011-09-04T15:42

By Anonymous
at 2011-09-06T04:36
at 2011-09-06T04:36

By Rae
at 2011-09-06T12:42
at 2011-09-06T12:42

By Tom
at 2011-09-07T03:04
at 2011-09-07T03:04

By Hazel
at 2011-09-08T13:38
at 2011-09-08T13:38

By Gilbert
at 2011-09-12T14:54
at 2011-09-12T14:54

By Mason
at 2011-09-15T21:21
at 2011-09-15T21:21
Related Posts
stack size settings

By Catherine
at 2011-08-30T00:01
at 2011-08-30T00:01
Aaron Seigo談論KDE SC 5.0-1

By Yedda
at 2011-08-29T21:09
at 2011-08-29T21:09
請問有軟體可以解析用Linux儲存的中文檔案嗎

By Mary
at 2011-08-29T16:38
at 2011-08-29T16:38
關於header file的位置

By Jake
at 2011-08-29T15:48
at 2011-08-29T15:48
Linux 3.1-rc4 is out.

By Edith
at 2011-08-29T13:27
at 2011-08-29T13:27