linux - 在 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 理解的,它完全被混淆了。
任何人都可以解释这种“引号和转义字符”行为背后的理性吗?
解决方案
如果我理解您的问题,则不能在环境变量的内容中使用大括号扩展。
为什么?Brace Expansion由您的 shell (bash) 提供。rsync
读取时--exclude=$toto
不应用外壳扩展的内容。更好的方法是生成要排除的文件列表,将输出重定向到一个文件,并且--exlcude-from=file
每file
行包含一个文件名(或规则)。
应用的所有引用和转义都来自尝试rsync
从{"*.ext1","*.ext2","*.ext3"}
. (基本上你已经把它搞糊涂了rsync
,它正在尽最大努力处理你给它的混乱)。
当您将应该是大括号扩展的内容存储在变量中时,将不会应用任何 shell 扩展,引号失去了它们的意义,并rsync
试图理清混乱。
查看--exclude
,--exclude-from
和rsync(1) - Linux 手册--filter
页
推荐阅读
- android - 以编程方式从任务栏 android 清除应用程序执行操作
- artificial-intelligence - 从文档中提取一个人的信息
- java - 如何将int保存在堆栈中?(java初学者)
- javascript - React JS 的 React Native { flex: 1 } 的等价物是什么?
- angular - 使用 ng-idle 的角度 4 中的会话超时
- php - 尝试显示远程图像(GET php)时出现问题 - 图像损坏/空
- html5-canvas - 为什么 FabricJS 上的 fabric.Path 显示与 svg 文件不同?
- python - Python Pandas Dataframe - 迭代行并添加字典问题
- c# - 如何通过 C# 在 MS Visio 中获取组对象的详细信息
- bash - 只有在前一个进程完成后才运行一个进程 | 重击