解釋錯誤訊息

解釋錯誤訊息

在我的腳本中,我有一個名為 的函數messages。我在 Linux Mint 中編寫了它,運行它沒有任何問題,當我將它移動到 Debian Buster 站時,該功能與/usr/bin/messages.

我有一個呼叫腳本的啟動腳本messages

啟動腳本

# call to messages script
. messages

訊息

messages() {
  # reformat the arguments and return them
}

稍後啟動腳本

messages "This is a message"

哪個拋出

./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
messages: could not open mailbox `/path/to/my/script/<string passed to my function>': No such file or directory

所以我收到了一堆與/usr/bin/messages被呼叫而不是我的函數相關的錯誤。

新增後type messages "This is a message",相關輸出為:

messages is /usr/bin/messages

我可以選擇重命名我的函數,但也許有更好的方法來處理這種情況。

如何告訴我的腳本忽略系統二進位並使用我自己的函數?


¹ 此函數在多個腳本中被多次調用,因此僅更改名稱並不是最簡單的選擇。

答案1

這是如何. file工作的:

如果file不包含 <slash>,shell 將使用 指定的搜尋路徑來PATH尋找包含檔案的目錄。

這種行為是由 POSIX 指定

你的第一個錯誤是

./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file

當你打電話時情況類似. echo

-bash: .: /bin/echo: cannot execute binary file

您正在嘗試獲取二進位檔案的來源/usr/bin/messages。實際上,定義函數的檔案根本沒有來源,該函數沒有在目前腳本中定義。這意味著稍後messages仍然意味著/usr/bin/messages,而不是功能。

相關行應該是. ./messagesor . /full/path/to/messages(即路徑你的文件,而不是二進位)。

答案2

解釋錯誤訊息

查看錯誤訊息中的行號。這樣你就知道錯誤發生在哪一行。這對我們來說是隱藏的,因為您向我們展示了包含超過 35 行的腳本中的幾行。

執行什麼文件。

. file-to-source當您使用或指定檔案時,將從左到右搜尋file-to-run環境變數中列出的目錄。$PATH目前目錄不在此列表中,因為它可能存在安全風險,或至少會造成混亂。它在當前目錄中運行一個程序,您必須指定它位於當前目錄中。例如. ./file-to-source./file-to-run(無需給出完整路徑)。

Unix 曾經.在 PATH 中存在,直到意識到這是一個問題。例如,ls在目前目錄中放置一個名為的程式。微軟Windows中的CMD仍然.隱含在 中PATH,你無法刪除它。這也是該作業系統上出現大量惡意軟體的原因之一。

一個陷阱

.指當前工作目錄而不是腳本所在的目錄。

為了解決這個問題,可以做這樣的事情。

(
   cd "$(dirname "$(readlink -f "$0")")"
   script_dir="$(pwd)"
)
script_dir/other_script

希望有人可以連結到更好的解決方案。

相關內容