我遇到过 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 会提示“错误:命令行不正确”。