zsh 大括号扩展包含变量提供的空格的参数

问题描述 投票:0回答:1

在 zsh 中,如何对包含变量提供的空格的参数使用大括号扩展?

例如,我想将文件从

~/a b/1.txt
重命名为
~/a b/2.txt

我可以使用大括号扩展(但不使用变量)从命令行手动执行此操作,通过反斜杠转义空格并且不引用大括号扩展路径,通过:

mv ~/a\ b/{1,2}.txt

以下均不起作用:

mv '~/a b/{1,2}.txt'

mv "~/a b/{1,2}.txt"

mv $'~/a b/{1,2}.txt'

mv '~/a\ b/{1,2}.txt'

mv "~/a\ b/{1,2}.txt"

mv $'~/a\ b/{1,2}.txt'

我希望能够使用变量的值来做到这一点,例如:

bep='~/a\ b/{1,2}.txt'
set -x
mv "${bep}"
mv ${bep}
mv $bep
set +x

但这行不通。

zsh 报告(因为

set -x
)运行的命令是:

mv '~/a\ b/{1,2}.txt'

既不更改引号,也不删除反斜杠以转义空格,

bep='~/a\ b/{1,2}.txt'
不会改变任何内容。

(Q)
和任何
(q)
参数扩展标志似乎都没有帮助。

我认为我应该尝试阻止 zsh 用单引号括住参数,但我不知道如何简洁地做到这一点。

或者也许有某种方法可以从单引号内启用大括号扩展。

或者……

variables path zsh quoting brace-expansion
1个回答
0
投票

您正在尝试执行以下操作吗?

touch a\ b/1.txt
mv a\ b/{1,2}.txt
mv a\ b/{2,1}.txt

ll -r a\ b
total 0
-rw-r--r--  1 tick talkies   0 12 Jun 18:51 1.txt
drwxr-xr-x  3 tick talkies  96 12 Jun 18:51 .. 
drwxr-xr-x  3 tick talkies  96 12 Jun 18:53 .

beb='mv a\ b/{1,2}.txt'

eval $beb     

ll a\ b/2.txt    
-rw-r--r--  1 tick talkies  0 12 Jun 18:51 a b/2.txt

注意:使用 eval 通常会被拒绝,因为它可能会注入狡猾的命令,但是如果你完全控制的话,那么情况就不那么严重了。

一如既往,测试/检查/仔细检查所有提供/显示的代码

© www.soinside.com 2019 - 2024. All rights reserved.