Shell脚本源代码未找到。

4

我正在运行下面这个简单脚本来测试代码块:

#!/bin/bash                                                                                                                         

# Load nvm and install latest production node                                                                                       
source $HOME/.nvm/nvm.sh
nvm install v0.10.12
nvm use v0.10.12

如果文件名是test.sh并且使用以上代码,我会得到以下错误:
test.sh: 5: test.sh: source: not found
test.sh: 6: test.sh: nvm: not found
test.sh: 7: test.sh: nvm: not found

根据我在SO上的评论,似乎脚本中的错误源于“==> source: not found”。当我自己在CLI上输入此代码时,代码可以正常工作。由于某种原因,我无法通过shell脚本执行此代码。
任何建议都将不胜感激。

1
你是如何执行脚本的? - Ignacio Vazquez-Abrams
1
错误信息中的行号似乎都偏移了1个。你的文件是否有DOS换行符? - chepner
我正在Amazon Web Service Ubuntu实例上执行脚本。由于我删除了printf语句,所以行号不准确。 - Val
2个回答

5

你的shebang行指定了Bash,但症状表明你正在使用sh运行它,而sh没有source命令。表面上,将source更改为一个点将解决这个问题,但是,如果被源文件包含任何Bashisms,那么它将失败(可能更微妙地,结果不正确,但没有错误消息)。

#!/bin/sh                                      
# Load nvm and install latest production node
. $HOME/.nvm/nvm.sh
nvm install v0.10.12
nvm use v0.10.12

通常情况下,最好将脚本标记为可执行,并通过shebang机制让操作系统选择正确的解释器;这样,您就不必记住脚本文件包含Bash命令还是sh命令或Python代码或编译代码或其他内容,也不必注意从一个版本到另一个版本是否更改。
因此,不要使用以下方式:
sh script

你会做

chmod +x ./script # the first time
./script

当权限正确时,只需要第二行。还有一些次要的额外注意事项,这就是为什么有些忙碌的开发人员有时会为即时问题提供最简单的指示。


感谢tripleee提供的答案。您关于使脚本可执行的额外评论帮助我解决了将该脚本集成回主要代码时遇到的一些问题。通过shebang语句让操作系统选择正确的解释器,这是完全合理的。 - Val
很棒的答案,简单易懂! - mohi

0
chmod +x $HOME/.nvm/nvm.sh 然后 sh $HOME/.nvm/nvm.sh 或 . $HOME/.nvm/nvm.sh

这将不会源化脚本,因此nvm命令将无法访问由nvm.sh定义的变量(或可能根本未定义)。 - tripleee

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