bash 脚本中的 7z 不会排除目录

bash 脚本中的 7z 不会排除目录

我遇到过 7z (或 bash,我还不知道)有点奇怪的行为。使用以下脚本:

#!/bin/bash
find /home/user  -type f -name "*.pdf" | cut -c 10- > /home/user/exclude_list2.lst;
lst1=" -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' "
command=$(/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user);
$command

另外,最后两行可以很容易地用单行替换:

/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user

我也尝试过:

command="/usr/bin/7z a  $lst1  -v2048M arch0.7z /home/dh ;"

我收到一个“arch0.7z”文件,但文件夹 .config 和 .cache 仍然包含在内,同时:

#!/bin/bash
find /home/user  -type f -name "*.pdf" | cut -c 10- > /home/user/exclude_list2.lst;
/usr/bin/7z a -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -v2048M arch0.7z /home/user ;"

生成一个包含正确排除的文件夹的文件。

所以,我想知道,从变量扩展的行有什么区别:

/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user

我输入的内容是:

 /usr/bin/7z a -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -v2048M arch0.7z /home/user

7z 工作流程发生如此重大变化有什么原因吗?

答案1

你的原始形式

command=$(/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user);
$command

将意味着$command包含输出7zip 运行的一部分,var=$(...)会将命令的输出存储到变量中。

所以,

/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user

不是替换,而是对脚本中错误的更正。

无论如何,面对真正的问题。

如果您在 shell 中运行变量赋值,您会注意到以下内容:

$ lst1=" -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' "
-bash: !'*.config/*': event not found

因此,这一行有一个错误,因为当"..."使用双引号时 shell 会进行变量替换等。有问题的项目是!,因为 bash 使用它来引用其历史记录中的先前命令。使用单引号代替:'...'

$ lst1=' -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' '
$ echo $lst1
-x@/home/user/exclude_list2.lst -xr!*.config/* -xr!*.cache/*

答案2

这是我没想到的事情。

lst1=' -xr@/home/me/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -xr!'*.local/*' '
7z a $lst1 -v2048M arch0.7z /home/me

做这个伎俩,当我在想单引号时-xr!'.config/'将结束变量赋值,它实际上作为参数的一部分。另外,如果我的变量是数组,则效果很好。

顺便说一下,用“!”来逃避。不起作用,7z 会提示“错误:命令行不正确”。

相关内容