在sh shell中找不到source命令。

289

我有一个使用sh shell的脚本。在使用source命令的那一行出现了错误,似乎我的sh shell中没有包含source命令。

如果我在shell中明确尝试运行source,我会得到以下错误:

sh: 1: source: not found

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


2
可以合理地认为,支持“source”的Shell是一种“错误版本”。 - William Pursell
3
此外,错误信息 source: not found 表示 source 命令已经被正确执行,但它应该读取的文件不存在。 - Simon Richter
7
由于“source”是shell的一个特性,因此不可能“安装”它。它不能作为外部命令实现。 - Christopher Schultz
14个回答

305

/bin/sh通常是其他外壳程序模仿Shell。很多发行版使用/bin/bash作为sh,它支持source。然而,在Ubuntu上,使用/bin/dash,它不支持source。大多数外壳程序使用.代替source。如果您无法编辑脚本,请尝试更改运行它的外壳程序。


7
谢谢!在Ubuntu上用/bin/bash替换/bin/sh确实有效!我很好奇为什么,这是否意味着在Ubuntu上bash就是sh? - Milad
4
@Milad:在最近的Ubuntu版本中,/bin/sh调用/bin/dash。传统上,/bin/sh调用/bin/bash处于sh兼容模式。 - choroba
@Milad 我觉得它在 Ubuntu 14.04 上不起作用。你的操作系统版本是什么? - Reza Ameri
1
如果有级联脚本,请将所有的“sh”重命名为“bash”。谢谢。 :-) - Bruno
4
很不幸,我一开始并没有立刻意识到如何解决这个问题,但它让我找对了方向。我必须在我的Makefile文件的顶部添加 SHELL := /bin/bash - fIwJlxSzApHEZIl
显示剩余2条评论

232

我实际上不被允许更改脚本,在Redhat服务器上它运行良好。但是在该服务器上,源代码似乎包含在sh中。 - Milad
3
如果它有“source”,它就不是严格的“sh”。 - tripleee
4
我曾在Jenkins上遇到这种问题(尝试获取存储为“秘密文件”的文件),使用“.”命令进行引用是解决方案。 - Jan Vlcinsky
9
为了与 Mac OS(开发环境)和 Travis-CI(测试环境)兼容,我不得不使用. ./filename。否则,在 Travis-CI 上运行测试时,我会收到“sh: 1: .: filename: not found”的错误提示。 - Adrien Joly
1
谢谢,这在Ubuntu 20.04上起作用了。虽然我不得不在npm命令中运行shell脚本。 - Faizi
显示剩余6条评论

69
$ls -l `which sh`
/bin/sh -> dash

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

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

那么就没问题了。


不错!我正在运行RHEL和Ubuntu服务器,而且我总是遇到像这样的Ubuntu小问题。我真的很喜欢RHEL和类似RHEL的Linux系统。 - radtek
被接受的答案在Ubuntu 14上不起作用,而这个可以! - rohithpr
请在您的答案中添加更多的解释 - 它是做什么的?dpkg-reconfigure可能无法访问所有用户,特别是在不基于Debian的系统上。 - Nico Haase
在Debian升级后,我解决了旧的Telnet客户端中出现的“source: not found”错误。谢谢。 - bjoster

53
source 内置命令是 Bash 才有的。可以用简单的 . 替代它。 例如:
. $FILE

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

. ./$FILE

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

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

17

这个问题是因为Jenkins Execute Shell通过其/bin/sh运行脚本所致。

因此,/bin/sh不知道"source"命令。

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

#!/bin/bash

2
这个问题和Jenkins没有关系。 - Nico Haase

13

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

source profile.txt 或者 source profile.properties

source 命令的替代方法是使用,

. ./profile.txt 或者 . ./profile.properties

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


9

source命令是一些shell内置的命令。如果您有一个脚本,它应该在第一行指定要使用的Shell,例如:

#!/bin/bash

好的,它说 #!/bin/sh ,在另一个 Linux 上,如果我手动输入 sh 并询问“哪个源”,它会告诉我:source: shell 内置命令。 - Milad
哦,原来这一行是干什么用的。我一直都在猜想。非常感谢! - CommonSenseCode

1

source 是一个 Bash 内置命令,因此要执行 source 命令,您可以作为 Root 登录。

sudo -s source ./filename.sh


这看起来不像是一个有效的解决方案。如果用户没有sudo权限怎么办?而且源代码只能作为管理员用户后才可用,这会引起新的麻烦。 - Nico Haase

1

1

如果您无法更改脚本以使用"."代替"source",请将"sh"的链接更改为指向"bash"而不是"dash":

# which sh
/usr/bin/sh

# which bash
/usr/bin/bash

# ls -la /usr/bin/sh
lrwxrwxrwx 1 root root 4 Oct  5 15:55 /usr/bin/sh -> dash

# ln -sf /usr/bin/bash /usr/bin/sh

# ls -la /usr/bin/sh
lrwxrwxrwx 1 root root 4 Feb  6 09:18 /usr/bin/sh -> bash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接