在我的脚本中,我有一个名为 的函数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
希望有人可以链接到更好的解决方案。