tar排除不在bash脚本中

时间:2018-02-14 13:10:24

标签: linux bash shell tar

我正在尝试创建一个文件夹的tar文件,其中包含大量要排除的文件。所以我写了一个脚本(mytar):

#!/usr/bin/env bash

# more files to be included 
IGN=""
IGN="$IGN --exclude='notme.txt'"

tar --ignore-failed-read $IGN -cvf "$1" "$2"

# following command is working perfectly
# bash -c "tar --ignore-failed-read $IGN -cvf '$1' '$2'"

测试文件夹:

test/
    notme.txt
    test.txt
    test2.txt 

如果我执行该脚本,它会创建一个tar文件,但不会排除我在IGN 中列出的文件 显然,命令是:

tar --ignore-failed-read --exclude='notme.txt' -cvf test1.tar test  

如果命令直接在shell中执行,该命令工作正常。此外,我找到了脚本的解决方法:在脚本文件中使用bash -c

bash -c "tar --ignore-failed-read $IGN -cvf '$1' '$2'"

我想知道并试图找出它,

为什么没有bash -c这个简单的命令无效?
为何使用bash -c

输出:
第一个输出不应该是容器notme.txt文件,如下所示 tar-exclude-issue-in-bash

更新1 脚本已更新

2 个答案:

答案 0 :(得分:2)

这与bash在shell中扩展变量的方式有关。

设置时:

IGN="--exclude='notme.txt'"

它将被扩展为:

tar --ignore-failed-read '--exclude='\''notme.txt'\''' -cvf test1.tar test  

因此,tar会查询名为\''notme.txt'\''的文件,但它找不到。

您可以使用:

IGN=--exclude='notme.txt'

将在shell扩展后正确解释,tar会知道它,但我建议你使用你的变量来存储要排除的文件名:

IGN="notme.txt"
tar --exclude="$IGN" -cvf ./test1.tar ./*

答案 1 :(得分:1)

在下面的命令中单引号是语法(不是文字,文件名参数不是用引号括起来),以防止shell在包含空格或制表符的情况下拆分参数

tar --ignore-failed-read --exclude='notme.txt' -cvf test1.tar test  

最接近的是使用数组而不是字符串变量:

ign=( --exclude='notme.txt' )
tar --ignore-failed-read "${ign[@]}" -cvf test1.tar test