Re: [問題] sh 與 ./
當我們打一個指令,譬如 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 執行了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.35.184.77
→
08/30 11:10, , 1F
08/30 11:10, 1F
推
08/30 17:19, , 2F
08/30 17:19, 2F
推
08/30 23:40, , 3F
08/30 23:40, 3F
→
08/31 00:22, , 4F
08/31 00:22, 4F
→
08/31 00:43, , 5F
08/31 00:43, 5F
→
08/31 00:43, , 6F
08/31 00:43, 6F
推
08/31 01:38, , 7F
08/31 01:38, 7F
→
08/31 01:38, , 8F
08/31 01:38, 8F
※ 編輯: james732 來自: 114.35.184.77 (08/31 02:57)
→
08/31 23:24, , 9F
08/31 23:24, 9F
→
08/31 23:27, , 10F
08/31 23:27, 10F
討論串 (同標題文章)