我正在尝试创建一个文件夹的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
文件,如下所示
更新1 脚本已更新
答案 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