Linux與命令列基礎
目前目錄中有附加執行權限的腳本 run.sh,輸入「run.sh」執行時出現「command not found」,輸入「./run.sh」則能執行。理由是下列何者?
- Arun.sh 沒有執行權限,只有在前面加上 ./ 時才能在沒有權限的情況下執行
- B不含斜線的指令名稱只會在環境變數 PATH 的目錄中尋找,而目前目錄一般不包含在其中
- Crun.sh 第1行的 #!/bin/bash(shebang)只有在前面加上 ./ 執行時才會被讀取
查看答案與解析
正確答案:B. 不含斜線的指令名稱只會在環境變數 PATH 的目錄中尋找,而目前目錄一般不包含在其中
shell 收到不含斜線的指令名稱時,會依序在環境變數 PATH 中以冒號分隔列出的目錄(/usr/local/bin:/usr/bin 等)中尋找並執行。為了避免誤執行放在其他地方的同名惡意程式,一般不會把目前目錄放進 PATH。像 ./run.sh 這樣寫出含有斜線的路徑時,就不會搜尋 PATH,而是直接執行該檔案。第1行的 #!/bin/bash(shebang)不論以哪種方式啟動,都會指定執行該腳本的直譯器。
- A. 若沒有執行權限,./run.sh 也會出現「Permission denied」而無法執行。
- B. 正確。目前目錄不在 PATH 中,所以需要用 ./ 指出位置。
- C. 不論是經由 PATH 找到或加上 ./ 啟動,shebang 都會由核心讀取,並以指定的直譯器執行腳本。