在我的腳本中,我有一個名為 的函數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
,而不是功能。
相關行應該是. ./messages
or . /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
希望有人可以連結到更好的解決方案。