变量替换无法将 --exclude 选项传递给 tar 命令
Variable substitution not working to pass --exclude options to tar command
我正在尝试通过环境变量将一些 --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 ...
即指定的文件夹已被排除。
那么为什么变量替换在这种情况下不起作用?
why is the variable substitution not working in this context?
赋值后变量 EXCLUDE_STUFF
包含 字面意思 字符串 --exclude='/captain/generated'
.
您正在通过变量替换传递 --exclude='/captain/generated'
。因为相对于你当前的工作目录没有字面上'
的目录,所以'/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 . Research shell quoting, how it works, and when by it, research word splitting expansion and filename expansion. Check your scripts with https://shellcheck.net。脚本局部变量更喜欢使用小写变量。
我正在尝试通过环境变量将一些 --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 ...
即指定的文件夹已被排除。
那么为什么变量替换在这种情况下不起作用?
why is the variable substitution not working in this context?
赋值后变量 EXCLUDE_STUFF
包含 字面意思 字符串 --exclude='/captain/generated'
.
您正在通过变量替换传递 --exclude='/captain/generated'
。因为相对于你当前的工作目录没有字面上'
的目录,所以'/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 . Research shell quoting, how it works, and when by it, research word splitting expansion and filename expansion. Check your scripts with https://shellcheck.net。脚本局部变量更喜欢使用小写变量。