在 sh shell 中找不到源命令

Posted

技术标签:

【中文标题】在 sh shell 中找不到源命令【英文标题】:source command not found in sh shell 【发布时间】:2012-11-22 01:12:55 【问题描述】:

我有一个使用sh shell 的脚本。我在使用source 命令的行中遇到错误。似乎source 不包含在我的sh shell 中。

如果我明确尝试从 shell 运行 source,我会得到:

sh: 1: source: not found

我应该以某种方式安装“源”吗?我的sh 版本有误吗?

【问题讨论】:

有人可以合理地辩称,支持source 的shell 是“错误版本”。 另外,错误消息source: not found 表示source 命令已正确评估,但它应该读取的文件不存在。 无法“安装”source因为它是 shell 的一个特性。它不能作为外部命令实现。 【参考方案1】:

/bin/sh 通常是其他一些试图模仿 The Shell 的 shell。许多发行版使用/bin/bash 表示sh,它支持source。但是,在 Ubuntu 上,使用了不支持 source/bin/dash。大多数 shell 使用 . 而不是 source。如果您无法编辑脚本,请尝试更改运行它的 shell。

【讨论】:

谢谢!用 /bin/bash 替换 /bin/sh 在 Ubuntu 上确实有效!我很好奇为什么,这是否意味着在 Ubuntu 上 bash 是 sh? @Milad:在最近的 Ubuntu 上,/bin/sh 调用 /bin/dash。传统上,/bin/sh 称为 /bin/bash 是 sh 兼容模式。 @Milad 我认为它不适用于 ubuntu 14.04。您的操作系统版本是多少? 也许知道帮助 - 如果您有级联脚本,则重命名所有“sh -> bash”。谢谢你。 :-) 不幸的是,如何解决这个问题对我来说并不是很直观,但它让我走上了正确的道路。我必须将SHELL := /bin/bash 添加到我的 Makefile 的顶部。【参考方案2】:

在 Bourne shell(sh) 中,使用 .获取文件的命令

. filename

在某些操作系统/环境中(至少是 Mac OS、Travis-CI、Ubuntu),这必须是:

. ./filename

(归功于Adrien Joly's comment below)

【讨论】:

我真的不能更改脚本,它在 redhat 服务器上运行良好。但是在该服务器上,源似乎包含在 sh 如果有source,严格来说不是sh 我在 Jenkins 上遇到了这种类型的问题(试图获取存储为“秘密文件”的文件)并通过“.”进行采购。命令是解决方案。 为了兼容 Mac OS(开发环境)和 Travis-CI(测试环境),我不得不使用. ./filename。否则,在 Travis-CI 上运行测试时,我会收到 sh: 1: .: filename: not found 错误。 感谢您在 ubuntu 20.04 上的工作。虽然我不得不在 npm 命令中运行 shell 脚本【参考方案3】:
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

这样就OK了

【讨论】:

不错!我正在运行 RHEL 和 Ubuntu 服务器,但我总是遇到一些小问题,比如 Ubuntu 的这个问题。我真的很喜欢 RHEL 和喜欢 linux 的 RHEL。 接受的答案在 Ubuntu 14 上不起作用,这个可以! 请为您的答案添加一些进一步的解释 - 它有什么作用? dpkg-reconfigure 可能并非所有用户都可以访问,尤其是在不基于 Debian 的系统上 在 debian 升级后修复了我的 source: not found 旧 telnet 客户端错误,谢谢。【参考方案4】:

source 内置是一个 bashism。将其简单地写为.

例如

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

【讨论】:

【参考方案5】:

出现这个问题是因为 jenkins Execute Shell 通过它的 /bin/sh 运行脚本

因此,/bin/sh 不知道“来源”

您只需在 jenkins 中的 Execute Shell 顶部添加以下行

#!/bin/bash

【讨论】:

给定的问题毕竟与 Jenkins 无关【参考方案6】:

我在尝试从 #Jenkins 执行 shell 调用 source 命令时遇到此错误。

source profile.txt 要么 source profile.properties

source命令的替换是使用,

. ./profile.txt 要么 . ./profile.properties

注意:两个点之间有一个空格(.)

【讨论】:

【参考方案7】:

source 命令内置在某些 shell 中。如果你有一个脚本,它应该在第一行指定使用什么shell,例如:

#!/bin/bash

【讨论】:

好吧,如果我手动输入 sh 并询问它告诉我的“哪个来源”,它会显示 #!/bin/sh 和另一个 linux:来源:shell 内置命令 哦,这就是这条线的用途。我一直想知道。非常感谢!【参考方案8】:

我在 Ubuntu 上的一个 gnu Makefile 中找到,(其中 /bin/sh -> bash)

我需要使用 .命令,以及使用 ./ 前缀指定目标脚本(参见下面的示例)

source 在这种情况下不起作用,不知道为什么,因为它应该调用 /bin/bash..

我的 SHELL 环境变量也设置为 /bin/bash

test:
    $(shell . ./my_script)

请注意,此示例不包含制表符;必须为堆栈交换格式化。

【讨论】:

【参考方案9】:

source是bash内置命令,所以要执行source命令,可以root登录。

sudo -s source ./filename.sh

【讨论】:

这看起来不是一个有效的解决方案。如果用户没有 sudo 权限怎么办?并且来源的东西之后只能作为管理员用户使用,这会造成新的麻烦【参考方案10】:

在 Ubuntu 上,我没有使用 sh scriptname.sh 来运行文件,而是使用 . scriptname.sh 并且成功了! 我的文件的第一行包含: #!/bin/bash

使用此命令运行脚本

.name_of_script.sh

【讨论】:

这已被多次回答。如果您在这种情况下添加新答案,请提供更多信息【参考方案11】:

这可能会对你有所帮助,我收到此错误是因为我试图使用命令 . .profile 重新加载我的 .profile 并且它有语法错误

【讨论】:

【参考方案12】:

Bourne shell (sh) 使用 PATH 定位到 source <file>。如果您尝试获取的文件不在您的路径中,则会收到错误“找不到文件”。

试试:

source ./<filename>

【讨论】:

帖子说sh: 1: source: not found不是file not found

以上是关于在 sh shell 中找不到源命令的主要内容,如果未能解决你的问题,请参考以下文章

sh:SET:在`npm start`中找不到命令

sh:gnuplot:在 Gnuplot + Xcode 中找不到命令

Docker,MySQL - 在 .sh 文件中找不到命令

在从 crontab 运行的 sh 脚本中找不到命令 [重复]

Bash变量分配中找不到命令错误

linux 环境下bash脚本中找不到命令