在sh shell中找不到源命令


146

我有一个使用shshell 的脚本。在使用source命令的行中出现错误。似乎source没有包含在我的sh外壳中。

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

sh: 1: source: not found

我应该以某种方式安装“源代码”吗?我的版本是否错误sh


1
可以合理地认为支持的shell source是“错误的版本”。
William Pursell

1
此外,该错误消息source: not found表示source已正确评估了该命令,但该命令应读取的文件不存在。
西蒙·里希特

4
“安装” source 不可能的,因为它是外壳的功能。它不能实现为外部命令。
Christopher Schultz,

Answers:


151

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


2
谢谢!用/ bin / bash替换/ bin / sh在Ubuntu上确实可行!我很好奇为什么但是,这意味着在Ubuntu bash上是sh吗?
Milad 2012年

1
@Milad:在最近的Ubuntu上,请/bin/sh致电/bin/dash。传统上,/bin/sh称为/bin/bashsh兼容模式。
choroba 2012年

@Milad我认为它在ubuntu 14.04上不起作用。您的操作系统是什么版本?
Reza Ameri 2014年

1
也许已知的帮助-如果您具有层叠脚本,则将所有重命名为“ sh-> bash”。谢谢。:-)
BG布鲁诺

不幸的是,这对我来说不是立即直观的,但它使我走上了正确的道路。我必须添加SHELL := /bin/bash到我的Makefile的顶部。
anon58192932

136

在Bourne shell(sh)中,使用。源文件命令

. filename

我实际上是不允许更改脚本的,它可以在Redhat服务器上正常运行。但是在该服务器上,源似乎包含在sh中
Milad 2012年

2
如果source不严格的话sh
2014年

4
我在Jenkins上遇到过这类问题(试图获取存储为“秘密文件”的文件)并通过“”进行采购。命令就是解决方案。
Jan Vlcinsky 2015年

这应该是最好的答案,因为它将与sh,dash和bash一起使用。
akhan

3
为了与Mac OS(开发环境)和Travis-CI(测试环境)兼容,我不得不使用. ./filename。否则,sh: 1: .: filename: not found在Travis-CI上运行测试时会出现错误。
艾德里安·乔利

48
$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,喜欢Linux的RHEL。
radtek

可接受的答案在Ubuntu 14上不起作用,这个答案可以!
rohithpr

请在回答中添加一些进一步的解释-它有什么作用?dpkg-reconfigure可能不适合所有用户,特别是在系统未基于Debian的访问
尼科·哈泽

source: not found在debian升级后,修复了旧telnet客户端的错误,谢谢。
bjoster


9

发生此问题是因为jenkins Execute Shell通过其/ bin / sh运行脚本

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

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

#!/bin/bash

给定的问题是不相关的詹金斯毕竟
尼科·哈泽

8

source命令内置在某些shell中。如果有脚本,则应在第一行中指定要使用的外壳,例如:

#!/bin/bash

好吧,它说#!/ bin / sh,在另一个Linux上,如果我手动输入sh并询问“哪个来源”,它告诉我:来源:shell内置命令
Milad 2012年

哦,这是这行的意思。我一直在想。非常感谢!
CommonSenseCode 2017年

5

当我尝试从#Jenkins execute shell 调用命令时遇到了此错误。

source profile.txt 要么 source profile.properties

使用命令替换,

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

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


0

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

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

源在这种情况下不起作用,不确定为什么,因为它应该调用/ bin / bash。

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

test:
    $(shell . ./my_script)

注意,此示例不包含制表符。必须格式化才能进行堆栈交换。


0

source是bash内置命令,因此要执行source命令,您可以以Root身份登录。

sudo -s source ./filename.sh


这看起来不是有效的解决方案。如果用户没有sudo权限怎么办?之后,采购的东西只能以管理员用户身份使用,这将引起新的麻烦
Nico Haase

0

在Ubuntu上,我使用而不是使用sh scriptname.sh来运行文件。scriptname.sh,它起作用了!我文件的第一行包含: #!/bin/bash

使用此命令运行脚本

.name_of_script.sh

1
这已经被回答了多次。如果您在这种情况下添加了新的答案,请提供更多信息
Nico Haase

-3

这可能对您有帮助,因为我正在尝试.profile使用命令重新加载我的命令. .profile,并且出现语法错误,所以我遇到此错误


-6

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

尝试:

source ./<filename>

5
该帖子里说sh: 1: source: not found不是file not found
克里斯蒂安·查A.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.