bash脚本源:没有这样的文件或目录


9

我有一个像这样开始的脚本

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

但是当我运行它返回 line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

但是该文件存在,并且在我运行source ~/myProjects/valkyrie/cluster.conf时可以正常运行。任何的想法?我在VALKYRIE其他地方设置了变量,因此无法在路径中添加硬编码。


我不确定100%是否会有所帮助,但是如果〜中有空格,您可以尝试完全引用该变量。因此,source "${VALKYRIE}/cluster.conf"
Sparhawk

不,没有帮助。
Khoi

1
我认为这与~无法正确扩展有关。当我使用故意伪造的路径运行脚本时,错误不会显示~,而是会扩展路径。您可以尝试用~绝对路径替换脚本中的吗?另外,尝试在script中运行以下命令echo ~
Sparhawk

2
您也可以尝试$HOME代替~
Sparhawk

3
@Khoi解释了这一点。~/.pam_environment不是shell脚本,因此它不会执行shell所期望的普通操作,例如波浪号扩展和参数扩展,因此~$HOME不会被替换。如果将那条线移到~/.profile另一条线并添加export 到前面,它应该可以工作。
geirha 2013年

Answers:


8

~似乎没有正确扩展。当我使用故意伪造的路径运行脚本时,错误不会显示~,而是会扩展路径(即/home/sparhawk/fakepath不会扩展~/fakepath。),您可以尝试使用$HOME代替~或在脚本中使用完整路径。

(我不确定为什么~在您的系统上不起作用,因为您的脚本对我来说很好用。)


当您查看bash执行扩展的顺序(gnu.org/software/bash/manual/bashref.html#Shell-Expansions)时,您会看到波浪号扩展发生变量扩展之前。这就是为什么$HOME~变量更好的原因
glenn jackman

@glennjackman我不确定我是否理解。为什么优先级对变量vs至关重要~
Sparhawk

1
这不完全是“优先级”,而是首先出现的。考虑x="~/.bashrc"; ls $x-按照“ ls”命令的扩展顺序,bash查找代字号,但找不到代号;最终bash看到了一个变量并将其扩展。bash不会返回并再次查找波浪号,这时它只是一个普通字符。并且当前目录中没有以波浪号开头的文件。
glenn jackman

啊好吧。我想我明白了。我一直想知道为什么该命令失败并x=~/".bashrc"; ls $x起作用。谢谢(你的)信息。
Sparhawk
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.