在 `cp` 命令的参数中使用命令替换

编程语言 2026-07-09

cp -r $(printf '%q ' "${fs[@]}") bar 不起作用,但 cp -r bar\ foo foo\ bar foo 能起作用:

yalihupokn@zoqu-endiman:~/Downloads$ ls -A
yalihupokn@zoqu-endiman:~/Downloads$ mkdir 'bar foo' 'foo bar'
yalihupokn@zoqu-endiman:~/Downloads$ ls
'bar foo'  'foo bar'
yalihupokn@zoqu-endiman:~/Downloads$ readarray -t -d $'\n' fs < <(cat<<EOF
> bar foo
> foo bar
> EOF
> )
yalihupokn@zoqu-endiman:~/Downloads$ printf '%q ' "${fs[@]}"
bar\ foo foo\ bar yalihupokn@zoqu-endiman:~/Downloads$ mkdir bar
yalihupokn@zoqu-endiman:~/Downloads$ ls
 bar  'bar foo'  'foo bar'
yalihupokn@zoqu-endiman:~/Downloads$ cp -r $(printf '%q ' "${fs[@]}") bar
cp: cannot stat 'bar\': No such file or directory
cp: cannot stat 'foo': No such file or directory
cp: cannot stat 'foo\': No such file or directory
cp: cannot copy a directory, 'bar', into itself, 'bar/bar'
yalihupokn@zoqu-endiman:~/Downloads$ mkdir foo
yalihupokn@zoqu-endiman:~/Downloads$ cp -r bar\ foo foo\ bar foo
yalihupokn@zoqu-endiman:~/Downloads$ ls foo
'bar foo'  'foo bar'
yalihupokn@zoqu-endiman:~/Downloads$

也许这是因为命令替换以特定的方式传入参数?如果是这样,我该如何修改这种行为以实现我的任务?

例如,在这种情况下,eval 真的是唯一的选项吗,还是有其他办法?

解决方案

你可以直接使用经过正确引用的数组:

cp -r "${fs[@]}" bar
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章