变量中的命令不能与文件名中的Witespace一起运行

时间:2018-12-10 12:10:20

标签: shell variables arguments whitespace filenames

我喜欢在Linux shell中将命令存储到变量中的可能性:

mycommand="cp fileOne.txt fileTwo.txt /home/myself/targetdir"
$mycommand

执行得很好。

但是如何处理文件名中的白色空间?

以下替代方案运行良好:

cp file\ One.txt file\ Two.txt /home/myself/targetdir
# and also
cp "file One.txt" "file Two.txt" /home/myself/targetdir

现在我也尝试将其放入变量中(以调用$mycommand)。

但我的以下尝试均未运行:

mycommand="cp file\ One.txt file\ Two.txt /home/myself/targetdir"
mycommand="cp \"file One.txt\" \"file Two.txt\" /home/myself/targetdir"
mycommand="cp 'file One.txt' 'file Two.txt' /home/myself/targetdir"
mycommand='cp "file One.txt" "file Two.txt" /home/myself/targetdir'

在所有选项中,参数均由空格分隔,找不到文件“ file”。

我该怎么办?

(我想知道为什么我找不到对此已经采取的类似问题...)

编辑:

使用set -x,根据上面的尝试,我得到了cp的以下几行:

+ cp 'file\' One.txt 'file\' Two.txt /home/myself/targetdir
+ cp '"file' 'One.txt"' '"file' 'Two.txt"' /home/myself/targetdir
+ cp ''\''file' 'One.txt'\''' ''\''file' 'Two.txt'\''' /home/myself/targetdir
+ cp '"file' 'One.txt"' '"file' 'Two.txt"' /home/myself/targetdir

每次尝试的第一行输出(从德语翻译为英语)是

cp: cannot stat 'file\': No such file or directory
cp: cannot stat '"file'’: No such file or directory
cp: cannot stat ''\''file': No such file or directory
cp: cannot stat '"file': No such file or directory

似乎命令字符串由空格分隔,忽略了""\-但是为什么呢?而我该如何避免呢?

1 个答案:

答案 0 :(得分:1)

我找到了解决方法:

eval $mycommand

,并且在其他情况下可能更安全

eval "$mycommand"

将按预期工作。

(使用eval变量将在执行前扩展。)

一个实际使用的例子:

提供了一个工具来连接诸如pdfunite之类的pdf文件:

for file in *.pdf; do
    inputfiles="$inputfiles \"$file\""
done
eval "pdfunite $inputfiles mergedOutputfile.pdf"