我喜欢在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
似乎命令字符串由空格分隔,忽略了""
和\
-但是为什么呢?而我该如何避免呢?
答案 0 :(得分:1)
我找到了解决方法:
eval $mycommand
,并且在其他情况下可能更安全
eval "$mycommand"
将按预期工作。
(使用eval
变量将在执行前扩展。)
一个实际使用的例子:
提供了一个工具来连接诸如pdfunite
之类的pdf文件:
for file in *.pdf; do
inputfiles="$inputfiles \"$file\""
done
eval "pdfunite $inputfiles mergedOutputfile.pdf"