当前位置: 首页>>技术教程>>正文


运行脚本时出现错误消息“源:未找到”

, ,

问题描述

我正在创建一个小的自动设置脚本,如果某些路径未导出,它将修改 /etc/profile$HOME/.profile。然后,我想自动重新加载这些。

我读过 source 是这样做的,所以我启动了终端并输入:

source /etc/profile
source ~/.profile

从终端,它没有输出任何错误。

但是,将这两个命令放在 Bash 脚本中会导致 source: not found

  1. 即使指定了 #!/bin/sh (显然,它不能保证),我如何确定脚本是由 Bash 执行的?

  2. 为什么当这两个来源明确无误的时候,却说找不到呢?

最佳办法

/bin/sh 不是 bash 。要使用 bash 执行脚本,请将 #!/bin/bash 作为脚本的第一行。

未删除错误 source: not found,因为未找到 /etc/profile。它已被删除,因为未找到 sourcesource 是 Bash 内置 函数,您不要使用 bash 执行脚本。所以很清楚为什么找不到它。更改脚本中的 #! 行,它将起作用。

次佳办法

一些 shell 支持 . 而不是 source 。所以你可以尝试这样的事情

. filename

代替

source filename

希望它有效

第三种办法

1. How can I be sure that the script is executed by Bash, even if #!/bin/sh is specified (apparently, it does not guarantee it)?

为确保为 sh shell 编写的脚本(如您的情况 – 请参阅 What is difference between #!/bin/sh and #!/bin/bash? )由 Bash 执行,只需运行以下命令:

bash script_name

因此,您将不会再收到该错误。

2. Why would it say that these two sources cannot be found when they are unmistakably there?

它并不是说那些源文件不存在。它说找不到 source 命令。这是正常的,因为由于您使用 #!/bin/sh 行启动脚本,因此您的脚本将使用 sh 而不是您可能认为的 bash 运行。为什么是正常的?因为 source 命令是 Bash 内置命令,而不是 sh 内置命令。要在 sh 中获取文件,您应该使用 .(点)。例子:

. /etc/profile
. ~/.profile

另一种方法是将 shebang 线更改为 #!/bin/bash,如 chaoshis answer 中所说。

第四种办法

看到这个 SO question

/bin/sh is usually some other shell trying to mimic The Shell. Many distributions use /bin/bash for sh, it supports source. On Ubuntu, though, /bin/dash is used which does not support source. If you cannot edit the script, try to change the shell which runs it.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12425.html,未经允许,请勿转载。