source命令不使用变量或带引号的字符串

时间:2018-04-25 18:58:29

标签: bash scripting

我遇到了这个问题。

如果我......

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

2 个答案:

答案 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"