bash脚本如何扩展文件全局?
在这段代码中,bash脚本如何扩展文件全局?,bash,tar,glob,Bash,Tar,Glob,在这段代码中,excludespec变量预期会匹配它的所有子字符串,但它似乎会在执行时对匹配它的实际文件求值,而不是使用它将其精确表示形式传递给tar命令 excludespec=${PWD##*/}\\\$USER\`hostname`.bkcd\u备份* 最终结果是创建的存档与排除列表不匹配,因此tar输出: tar::文件在读取时发生了更改 定义它的字符串是否在做我不知道的事情 代码如下: #!/bin/sh # bkcd - backup current directory in si
excludespec
变量预期会匹配它的所有子字符串,但它似乎会在执行时对匹配它的实际文件求值,而不是使用它将其精确表示形式传递给tar命令
excludespec=${PWD##*/}\\\$USER\`hostname`.bkcd\u备份*
最终结果是创建的存档与排除列表不匹配,因此tar输出:
tar::文件在读取时发生了更改
定义它的字符串是否在做我不知道的事情
代码如下:
#!/bin/sh
# bkcd - backup current directory in situ
DMY_M() {
date +%Y%m%d_%H%M
}
timestring=$(DMY_M)
echo `pwd` - $timestring > .bkcdspec
filename=${PWD##*/}\_$USER\_`hostname`.bkcd_backup.$timestring.tar.gz
excludespec=${PWD##*/}\_$USER\_`hostname`.bkcd_backup*
fullexclude="$excludespec"tar.gz
echo excludespec - $excludespec
echo filename - $filename
echo fullexclude - $fullexclude
tar -cpzf $filename --exclude=$fullexclude .
rm .bkcdspec
抑制globbing的常用技巧是将字符串括在双引号中(当需要展开反勾号或变量时)或单引号中(当不需要展开时)。因此,在这里,您需要消除
$excludespec
并设置$fullexclude
:
fullexclude="${PWD##*/}_${USER}_$(hostname).bkcd_backup*.tar.gz"
并将其用作:
tar -cpzf "$filename" --exclude="$fullexclude" .
(如果“$fullexclude”
周围没有双引号,如果您碰巧有一些文件名为--exclude=…value of-$fullexclude
,您会感到惊讶。您不太可能有这样的文件,但您最好在问题出现之前避免它。)
请注意,当您回音进行调试时,停止globbing也是至关重要的;同样,双引号:
echo "filename=$filename"
echo "fullexclude=$fullexclude"
否则,echo
会对名称进行全局扩展,再次让您感到困惑
将这些变化放在一起会导致:
#!/bin/sh
# bkcd - backup current directory in situ
timestring=$(date +%Y%m%d_%H%M)
echo "$(pwd) - $timestring" > .bkcdspec
prefix="${PWD##*/}_${USER}_$(hostname).bkcd_backup"
filename="$prefix.$timestring.tar.gz"
fullexclude="$prefix.*.tar.gz"
echo "filename - $filename"
echo "fullexclude - $fullexclude"
tar -cpzf "$filename" --exclude="$fullexclude" .
rm .bkcdspec
你不需要