218

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

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

sh: 1: source: not found

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

4

12 回答 12

227

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

于 2012-12-04T12:26:30.743 回答
180

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

. filename

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

. ./filename

归功于 Adrien Joly 下面的评论

于 2012-12-04T12:03:55.643 回答
62
$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了

于 2014-01-07T06:16:01.100 回答
45

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

于 2017-07-13T19:38:09.703 回答
14

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

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

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

#!/bin/bash
于 2016-01-25T09:06:02.997 回答
10

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

source profile.txt 或者 source profile.properties

替换命令是使用,

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

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

于 2019-03-27T17:04:31.470 回答
9

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

#!/bin/bash
于 2012-12-04T12:04:58.333 回答
0

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

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

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

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

test:
    $(shell . ./my_script)

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

于 2015-10-07T18:28:21.120 回答
0

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

sudo -s source ./filename.sh

于 2017-08-15T08:42:53.533 回答
-1

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

使用此命令运行脚本

.name_of_script.sh
于 2020-01-11T03:55:22.100 回答
-3

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

于 2016-11-11T22:10:25.300 回答
-8

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

尝试:

source ./<filename>
于 2014-10-08T08:25:50.457 回答