在 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 用单引号括住参数,但我不知道如何简洁地做到这一点。
或者也许有某种方法可以从单引号内启用大括号扩展。
或者……
您正在尝试执行以下操作吗?
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 通常会被拒绝,因为它可能会注入狡猾的命令,但是如果你完全控制的话,那么情况就不那么严重了。
一如既往,测试/检查/仔细检查所有提供/显示的代码