linux 变量替换无法将--exclude选项传递给tar命令

2eafrhcq  于 2023-03-01  发布在  Linux
关注(0)|答案(1)|浏览(104)

我尝试通过env var将一些--exclude语句传递给我的tar命令(实际上,我将传递几个--exclude语句,并尝试通过将定义放在单独的行中来提高可读性):

# EXCLUDE_STUFF="--exclude='/captain/generated'"
# tar ${EXCLUDE_STUFF} -cvzf /dev/null /captain
/captain/
/captain/generated/
/captain/generated/registry-auth
... etc ...

也就是说,它不排除我指定的文件夹。如果我用引号把${EXCLUDE_STUFF}括起来,也没有什么区别。
这是我回显上面的命令时得到的结果:

# echo tar ${EXCLUDE_STUFF} -cvzf /dev/null /captain
tar --exclude='/captain/generated' -cvzf /dev/null /captain

所以看起来命令是正确的。当我直接运行扩展后的命令时,我得到:

# tar --exclude='/captain/generated' -cvzf /dev/null /captain
/captain/
/captain/temp/
/captain/data/
... etc ...

即指定的文件夹 * 已 * 被排除。
那么,为什么变量替换在这种情况下不起作用呢?

yzuktlbb

yzuktlbb1#

为什么变量替换在这种情况下不起作用?
赋值后,变量EXCLUDE_STUFF包含字符串--exclude='/captain/generated'
您正在从变量替换中传递--exclude='/captain/generated'。由于不存在相对于当前工作目录的名为 literally'的目录,因此'/captain/generated'不匹配任何内容,因此它不排除任何内容。
简而言之,tar --exclude='/captain/generated'tar "--exclude='/captain/generated'"不同。
在这种情况下,只要

exclude_stuff="--exclude=/captain/generated"
tar "$exclude_stuff" ...

或者使用bash数组:

exclude_stuff=( --exclude='/captain/generated' )  # note: quotes are interpreted
tar "${exclude_stuff[@]}" ...

阅读https://mywiki.wooledge.org/BashFAQ/050。研究shell引用,它是如何工作的,什么时候使用它,研究单词拆分扩展和文件名扩展。检查你的脚本。首选使用小写变量作为脚本局部变量。

相关问题