sh 與 ./ - Linux

Cara avatar
By Cara
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 執行了

--
Tags: Linux

All Comments

Adele avatar
By Adele
at 2011-08-31T19:52
打這麼多字竟然賺不到400P...
Victoria avatar
By Victoria
at 2011-09-04T15:42
好人超哥推!
Anonymous avatar
By Anonymous
at 2011-09-06T04:36
如果可以按讚我就幫你按 100 次
Rae avatar
By Rae
at 2011-09-06T12:42
感謝樓上 :) 想說好少人推,是不是我寫錯了什麼
Tom avatar
By Tom
at 2011-09-07T03:04
把x標記消掉用chomd -x filename比較好
chmod
Hazel avatar
By Hazel
at 2011-09-08T13:38
因為我都用 a 搜尋我的文章看回答,所以回應的文
這麼晚才看到
Gilbert avatar
By Gilbert
at 2011-09-12T14:54
最簡單的方法 . configure
Mason avatar
By Mason
at 2011-09-15T21:21
不需要打sh

stack size settings

Catherine avatar
By Catherine
at 2011-08-30T00:01
最近因為有用到軟體需要指定stack size=unlimited Server是使用CentOS 5.6 我個人採用的方式是在~/.bash_profile (個人的設定檔) 中加上 and#34;ulimit -s unlimitedand#34; 而我用這個方法之後 以and#34;ulimit -a ...

Aaron Seigo談論KDE SC 5.0-1

Yedda avatar
By Yedda
at 2011-08-29T21:09
這篇文章是derStandard.at對Aaron Seigo所做的專訪,談到KDE Frameworks 5.0、 Applications、Workspace 與 Plasma active未來的發展 derStandard.at:你剛才宣布KDE Frameworks 5.0。背後有什麼想法嗎? ...

請問有軟體可以解析用Linux儲存的中文檔案嗎

Mary avatar
By Mary
at 2011-08-29T16:38
如題 我們實驗室原本有使用一個Q NAP公司的FTP(TS-201) 不幸的,最近壞掉了 我們嘗試將裡面的檔案救出來 但是聯絡原廠才知道硬碟資料是用Linux格式儲存的 我有下載R-Linux嘗試拉出裡面的檔案 但路徑跟名稱有中文的全變亂碼了 不知道有沒有其他辦法可以救他 -- 不 ...

關於header file的位置

Jake avatar
By Jake
at 2011-08-29T15:48
各位板友好 小弟是使用Ubuntu 10.04 目前因為要安裝某一個軟體 但必須要事前安裝 Motif library sudo apt-get install libmotif-dev 安裝完之後 下./configure之後發現找不到Motif的header file checking Xm/ ...

Linux 3.1-rc4 is out.

Edith avatar
By Edith
at 2011-08-29T13:27
Linus Torvalds - 下午1:00 - 公開 Linux 3.1-rc4 is out. Most noticeable thing for most users is likely the lack of warnings about duplicate sysfs files for ...