【问题标题】:Shell script error in UNIX but works in CentOS - source: not foundUNIX 中的 Shell 脚本错误,但在 CentOS 中有效 - 来源:未找到
【发布时间】:2017-07-21 05:49:49
【问题描述】:

myconf.sh

setting1=val1
setting2=val2
export setting1
export setting2

然后我在我的 runner.sh 中调用这个 conf 文件,但我收到错误“runner.sh: source: not found”。最初我在内部调用 source myconf.sh 时使用它,并在一些帖子中看到我应该使用“。”而不是“来源”。

myrunner.sh

#!/bin/sh
. myconf.sh
echo "$setting1"
echo "$setting2"

我正在通过这个命令调用 myrunner.sh

sh myrunner.sh

如果我真的做错了什么,请告诉我。我可以在我的 CentOS 映像中正确调用它而不会出错,但是当我们在 UNIX 机器中执行它时,我遇到了错误。

谢谢!

【问题讨论】:

  • 这在什么平台上不起作用?这是什么特定的 UNIX?
  • 您是说即使您将source 替换为. 之后,它仍会使用source: not found 失败?
  • 使用.没有错。使用source 很有用,因为人类读者通常会发现它比. 更具可读性,但它们完全相同。但是,这是有问题的,因为并非所有的 shell 都能识别它。
  • sourcesh 错误。 POSIX 标准只保证. myconf.sh,而不是source myconf.sh,工作,如果你使用sh(而不是bashksh等)来运行你的脚本,唯一保证的功能是目前是在 POSIX sh 标准中。
  • @user3694537 我在这里部分猜测,但您的意思是“不,它不再显示source: not found。当我用. 替换它时,消息变为.: myconf.sh: not found” ?如果是这样,您确实需要更新您的帖子以反映这一点。

标签: shell unix


【解决方案1】:

您的$PATH env var 设置为什么?

您可能只需要在路径中包含当前目录或为文件名添加前缀。

例如:source ./myconf.sh

预计到达时间:如前所述;将当前目录 . 放入您的路径可能不是最理想的事情。我建议它只是为了解释为什么您的脚本可以在一个系统上运行,而在另一个系统上却不行。

【讨论】:

  • 将当前目录添加到PATH 不是一个好主意,因为有一天您可能会将此脚本放在内容未知的目录中,并且可能会在myconf.sh 调用中运行其他内容。像source $(dirname $0)/myconf.sh 这样的东西可能更可靠。但你说得对,如果目标脚本不在PATH 中,则必须指定其路径。
  • @FlorianWeimer 同意。
  • . "$(dirname "$0")/myconf.sh" 比上面的更不容易出错。
  • 我从未将当前目录包含在我的PATH 中,但./source 对我来说仍然可以正常工作。
  • @jwodder,是的,这是一个特例; ./source 在当前目录中查找(实际上,之前)PATH。但是将. 添加到PATH 意味着您很容易受到非source 调用的此类漏洞的攻击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2011-02-27
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多