我遇到了这个问题。
如果我......
source /Users/cristian/Proyectos/MikroTik\ Updater/sources/testfile
确实有效
如果我......
source "/Users/cristian/Proyectos/MikroTik\ Updater/sources/testfile"
它没有
问题是我正在使用一个包含路径的变量
所以这......
mypath="/Users/cristian/Proyectos/MikroTik\ Updater/sources/testfile"
source $mypath
既不起作用
我找到了解决办法......
eval "source $mypath"
但当然这是一个很大的安全漏洞,因为文件名来自一个参数
我该怎么办?
编辑:
正如您在代码中看到的那样,我回显文件名,然后尝试获取它
updaterpath="$( cd "$(dirname "$0")" ; pwd -P | sed 's/ /\\ /g' )"
sourcefile="$updaterpath/sources/$1"
echo $sourcefile
source $sourcefile
在输出中,我得到了正确的回显路径以及来自source
的错误,说它不存在!有趣的是,无论我cat
该文件,我都可以看到内容,所以文件路径是正确的!
/Users/cristian/Proyectos/MikroTik\ Updater/sources/testfile
/Users/cristian/Proyectos/MikroTik Updater/updater.sh: line 7: /Users/cristian/Proyectos/MikroTik\: No such file or directory
答案 0 :(得分:5)
您的原始问题未包含错误代码:
### THIS IS BROKEN: the backslashes added by sed are literal, not syntactic
path=$(cd "$(dirname "$0")"; pwd -P | sed 's/ /\\ /g')
source $path/sources/$1
sed
是您问题的根源。摆脱它:
### THIS IS CORRECT: The syntactic quotes mean no backslashes are needed.
# ...also handles the case when the cd fails more gracefully.
path=$(cd "$(dirname "$0")" && pwd -P) || exit
source "$path/sources/$1"
...或者,甚至更好:
source "${BASH_SOURCE%/*}/sources/$1"
反斜杠仅在解析为语法时才有意义。字符串扩展的结果不会经历这些解析步骤。这与使用字面引号不能用于在字符串中构建命令的原因相同,如BashFAQ #50中所述。
答案 1 :(得分:0)
如果有人需要看到代码,代码会保持这种状态
updaterpath="$( cd "$(dirname "$0")" ; pwd -P )"
sourcefile="$updaterpath/sources/$1"
echo $sourcefile
source "$sourcefile"