gpt4 book ai didi

linux - 在 rsync 参数中使用环境变量(处理引号和转义字符)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:00 25 4
gpt4 key购买 nike

我想将 rsync 与 --exclude 命令一起使用,看起来像

rsync -av --exclude={"*.ext1","*.ext2", "*.ext3"} source target 

(出于某种原因,使用这种语法比使用 --exclude-from=FILE 语法对我来说更方便)

我想在 rsync 中使用一个环境变量,这样我就可以做到

export toto='{"*.ext1","*.ext2", "*.ext3"}'
rsync -av --exclude=$toto source target

问题是它没有按我希望的方式工作。当我对 $toto 变量使用自动完成时,它显示:

\{\"\*.ext1\",\"\*.ext2\",\ \"\*.ext3\"\} 

这实际上是 rsync 所理解的,它会完全混淆。

谁能解释这种“引号和转义字符”行为背后的合理性?

最佳答案

这个有效:

MYEXCLUDE={'*.ext1','*.ext2'}
eval rsync -av --exclude=$MYEXCLUDE src dest

如前所述,{,} 触发大括号扩展(顺便说一句,您的示例中 ext3 之前的空格 一个问题:它阻止了大括号 exp)。而 rsync 的 exclude 选项只接受单一模式(这意味着通过替换 rsync 和 echo 可以理解所有内容)。

碰巧,当第一行设置变量时,大括号扩展还没有发生(echo $MYEXCLUDE 显示:{*.ext1,*.ext2} ).大括号扩展发生在 变量扩展之后。所以诀窍是使用 eval 来及时进行扩展。要完全理解,请比较以下两行:

MYEXCLUDE=--exclude={'*.ext1','*.ext2'}
echo $MYEXCLUDE
eval echo $MYEXCLUDE

显示

--exclude={*.ext1,*.ext2}
--exclude=*.ext1 --exclude=*.ext2

关于linux - 在 rsync 参数中使用环境变量(处理引号和转义字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51609222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com