Re: [問題] sh 與 ./

看板Linux作者 (好人超)時間14年前 (2011/08/30 11:04), 編輯推噓3(307)
留言10則, 5人參與, 最新討論串3/3 (看更多)
當我們打一個指令,譬如 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
打這麼多字竟然賺不到400P...
08/30 11:10, 1F

08/30 17:19, , 2F
好人超哥推!
08/30 17:19, 2F

08/30 23:40, , 3F
如果可以按讚我就幫你按 100 次
08/30 23:40, 3F

08/31 00:22, , 4F
感謝樓上 :) 想說好少人推,是不是我寫錯了什麼
08/31 00:22, 4F

08/31 00:43, , 5F
把x標記消掉用chomd -x filename比較好
08/31 00:43, 5F

08/31 00:43, , 6F
chmod
08/31 00:43, 6F

08/31 01:38, , 7F
因為我都用 a 搜尋我的文章看回答,所以回應的文
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
最簡單的方法 . configure
08/31 23:24, 9F

08/31 23:27, , 10F
不需要打sh
08/31 23:27, 10F
文章代碼(AID): #1EN5Ct70 (Linux)
討論串 (同標題文章)
文章代碼(AID): #1EN5Ct70 (Linux)