使用 ./ (點斜槓)執行指令碼檔案?
概述
在本教程中,我們將學習如何在 Linux 中使用 / (點斜槓)命令執行檔案。這是 Linux 中最常用的命令之一,使用起來非常簡單。讓我們首先了解點斜槓是什麼意思?
Linux 命令中的點斜槓是什麼意思?
點斜槓或正斜槓 (/),如您所知,用於分隔目錄和檔案。例如:如果我有一個名為“/home/user1/Desktop”的目錄,那麼當我在此目錄上鍵入 ls -l 時,它將顯示該目錄的所有內容,如下所示:
-rwxr-xr-x 1 user1 user1 0 Jun 12 19:09 Desktop
如果我只想列出該目錄內的檔案,我可以鍵入 ls –l /home/user1/desktop 來實現。上述命令將給出與下面相同的輸出:
drwxr-xr-xs 2 user1 user1 4096 Jun 12 19:09 desktop
為什麼我們需要 ./ 來執行檔案?
我們將使用命令列執行 script.sh 檔案。我們不會提及任何路徑。
$ script.sh -bash: script.sh: command not found
由於我們位於與 script.sh 相同的目錄中,Bash 能夠找到 script.sh 檔案。但是,由於 script.sh 檔案不存在,我們必須透過指定其位置來告訴 Bash 在哪裡查詢 script.sh 檔案。
在使用 Linux 時,.(點)符號表示當前工作資料夾。現在假設我們想從當前工作資料夾中執行我們的指令碼。
$ ./script.sh The program run successfully.
請注意正斜槓 (/)。正斜槓用於在 Unix/Linux 系統中表示目錄。它們還用於分隔檔名。在本例中,它們用於分隔指令碼檔名和 .sh 副檔名。如果沒有它們,我們將最終得到一個名為 "./script.sh" 的檔案。
現在是時候回答我們之前的問題了。為什麼我們要/需要將我們的當前目錄新增到 $PATH?因為我們的當前目錄未包含在 $PATH 中。
系統可執行檔案與使用者可執行檔案
$PATH 變數通常包含程式所在的每個目錄的路徑。讓我們看一下它的典型內容:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
$PATH 用於指定系統命令(如 ls)的位置。在 Linux 系統上,shell 會在 $PATH 環境變數中列出的目錄中搜索命令。如果在那裡找不到命令,則 shell 會嘗試從當前目錄執行命令。
$ ls File1 File2 log
如果有多個路徑包含可執行檔案,Linux 將選擇在 $PATH 中找到的第一個可執行檔案。
您還可以使用 which 來獲取任何程式的完整路徑,這些程式可以透過在 shell 提示符下鍵入其名稱來執行。
$ which ls /bin/ls
搜尋規則
在 Linux 中搜索可執行檔案時,有一個名為 which 的命令可以幫助我們記住一件重要的事情:
如果檔名中存在斜槓 (/) 字元,則不要在 $PATH 中搜索該檔案。
如果 PATH 變數中不存在斜槓,則只在當前目錄中搜索。
我們可以擁有與命令完全相同的名稱的指令碼,例如,並在當前目錄中執行它們,而不會發生衝突。
例如,假設我們要編寫一個名為“ls”的 shell 命令,該命令列出我們當前目錄中的檔案。然後,我們可以將以下內容鍵入我們的終端視窗:
$ ./ls
這是一個 ls 的示例指令碼。
因為我們在檔名之前指定了“/”,所以 Bash 將在當前工作目錄中搜索指定的檔名。
您還可以使用系統命令“ls”來列出當前資料夾中的所有檔案和資料夾。
$ ls File1 File2 log ls
如果我們不帶任何引數執行該命令,Bash 將搜尋 $PATH 環境變數中列出的目錄中的檔案。
您可以透過匯出將當前工作目錄(“.”)新增到 $PATH 環境變數,但這最好避免這樣做,因為它可能導致安全問題。
在 $PATH 中包含 . 時的安全問題
假設我們將當前工作目錄新增到 $PATH。如果我們將“.”作為 PATH 中的第一個條目,那麼將執行我們的 ls 示例,而不是真正的 ls 命令。
$ ls
這是一個 ls 的示例指令碼。
如果我們執行 ls −l,我們希望確保我們確實正在執行 ls 命令,而不是其他名為 ls 的可執行檔案。有人可能會將惡意程式碼放入 ls 可執行檔案中以刪除我們的檔案或更改其內容。因此,這是一個潛在的安全威脅。
我們可以將“.”新增到我們的 $PATHS 變數中,以便系統命令 `ls` 和 `grep` 都可以工作。但是我們仍然可能會遇到一些安全問題。
如果我們在終端中鍵入“sl”,而不是收到“非法命令”或“找不到命令”的響應,那麼當前工作資料夾中可能存在我們不知道的惡意程式“sl”。
$ sl
這可能是一個病毒。
Windows 與 Linux
預設情況下,Windows PATH 變數包含當前目錄。因此,當您從 Windows 控制檯執行程式時,它會在查詢其他位置之前查詢當前目錄中的程式。
與 Windows 不同,在 Windows 中,當前目錄會自動新增到系統的 $PATHS 變數中,而在 Linux 中,當前目錄不會自動新增到系統的 $PATHS 變數中。要將當前目錄包含在系統的環境變數中,我們必須使用 export 命令手動將其新增到系統的 $PATHS 變數中。
結論
我們學習瞭如何使用 "./" 在當前工作目錄中執行 shell 命令。因為當前目錄不在 $PATHS 變數中,所以我們必須指定檔案的相對路徑或絕對路徑。然後,我們介紹了 Linux 中的搜尋規則,該規則解釋瞭如何使用 grep 命令進行搜尋。我們討論瞭如果我們將“.”新增到 $PATH 環境變數中可能發生的一些安全風險。
最後,始終最好明確指定我們要執行可執行檔案的位置。當執行多個使用者帳戶時,檢查 PATH 環境變數是否包含“.”是個好主意。