在 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:gnuplot:在 Gnuplot + Xcode 中找不到命令