在我的脚本中,我有一个名为messages
. 我在 Linux Mint 中编写它,运行它没有问题,当我将它移到 Debian Buster 站时,该功能与/usr/bin/messages
.
我有一个调用脚本的启动脚本messages
:
启动脚本
# call to messages script
. messages
消息
messages() {
# reformat the arguments and return them
}
稍后在 startup_script
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
我可以选择重命名我的函数¹,但也许有更好的方法来处理这种情况。
如何告诉我的脚本忽略系统二进制文件并使用我自己的函数?
¹ 该函数在多个脚本中多次调用,因此仅更改名称并不是最简单的选择。
这是如何
. file
工作的:此行为由 POSIX 指定。
你的第一个错误是
当你打电话时它是相似的
. echo
:您正在尝试获取二进制文件
/usr/bin/messages
。实际上,您的定义函数的文件根本没有来源,该函数未在当前脚本中定义。这意味着以后messages
仍然意味着/usr/bin/messages
,而不是功能。相关行应该是
. ./messages
或. /full/path/to/messages
(即文件的路径,而不是二进制文件的路径)。解释错误消息
查看错误消息中的行号。这样你就会知道错误在哪一行。这是对我们隐藏的,因为您向我们展示了包含超过 35 行的脚本中的几行。
执行什么文件。
. file-to-source
当您使用或指定文件时,会从左到右搜索file-to-run
环境变量中列出的目录。$PATH
当前目录不在此列表中,因为它可能存在安全风险,或者至少会造成混淆。它在当前目录中运行程序,您必须指定它在当前目录中。例如. ./file-to-source
或./file-to-run
(无需提供完整路径)。Unix 曾经
.
在 PATH 中,直到人们意识到这是一个问题。例如ls
,在当前目录中放置一个调用的程序。微软 Windows 中的 CMD 仍然.
隐含在 中PATH
,不能删除。这是此操作系统上的高商城软件的原因之一。一个陷阱
.
指的是当前工作目录而不是脚本所在的目录。为了解决这个问题,可以做这样的事情。
希望有人可以链接到更好的解决方案。