解释错误消息

解释错误消息

在我的脚本中,我有一个名为 的函数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

希望有人可以链接到更好的解决方案。

相关内容