首页 > 解决方案 > 在 rsync 参数中使用环境变量(处理引号和转义字符)

问题描述

我想将 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 理解的,它完全被混淆了。

任何人都可以解释这种“引号和转义字符”行为背后的理性吗?

标签: linuxbashenvironment-variables

解决方案


如果我理解您的问题,则不能在环境变量的内容中使用大括号扩展

为什么?Brace Expansion由您的 shell (bash) 提供。rsync 读取--exclude=$toto不应用外壳扩展的内容。更好的方法是生成要排除的文件列表,将输出重定向到一个文件,并且--exlcude-from=filefile行包含一个文件名(或规则)。

应用的所有引用和转义都来自尝试rsync{"*.ext1","*.ext2","*.ext3"}. (基本上你已经把它搞糊涂了rsync,它正在尽最大努力处理你给它的混乱)。

当您将应该是大括号扩展的内容存储在变量中时,将不会应用任何 shell 扩展,引号失去了它们的意义,并rsync试图理清混乱。

查看--exclude,--exclude-fromrsync(1) - Linux 手册--filter


推荐阅读