我正在调试一个shell脚本,它在一个系统上运行良好,但在另一个系统上却失败了。该脚本本质上是解压缩和解压归档的日志文件,然后对所包含的日志文件中给定子字符串进行greps。
经过一些分析和调试,我现在发现,在一个系统上,一个嵌入的basename $TAR\_FILENAME命令被正确执行(即,反划线之间的命令被执行,结果替换了反划线之间的字符串的一部分),而在另一个系统上,这种替换没有发生,而是插入了字符串basename <filename-here> (包括反划线)。当然,这会破坏对该字符串的进一步处理,grep也无法工作。
是什么导致了这种情况?可以启用/禁用bash中的反勾号功能吗?我不知道有任何设置或开关可以打开/关闭该功能。还是真的有?
稍后添加:脚本如下:
#!/bin/bash
pattern=$1
for f in *.tar.gz; do
echo "$f:"
tar -xzf "$f" --to-command 'echo "f:`basename $TAR_FILENAME` s:'"$pattern\""
done在一个系统上,这会产生如下代码行: f:localhost_access_log.2021-07-29.txt s:pattern
在第二个示例中,这将生成如下代码行: f:basename ./localhost\_access\_log.2021-07-29.txt s:pattern
这两个系统都在SLES-11上(非常旧,确实...)。
发布于 2021-09-06 17:29:25
tar 1.26将命令传递给外壳程序(source):
argv[0] = "/bin/sh";
argv[1] = "-c";
argv[2] = to_command_option;
argv[3] = NULL;
priv_set_restore_linkdir ();
execv ("/bin/sh", argv);tar 1.27对此进行了更改,以跳过作为另一个修复程序(source)的一部分的外壳:
if (wordsplit (cmd, &ws, (WRDSF_DEFFLAGS | WRDSF_ENV) & ~WRDSF_NOVAR))
FATAL_ERROR ((0, 0, _("cannot split string '%s': %s"),
cmd, wordsplit_strerror (&ws)));
execvp (ws.ws_wordv[0], ws.ws_wordv);由于shell负责处理反标记,因此将在1.26中解释它们,而不是1.27.1。
对于TAR1.29,行为是changed back。
https://stackoverflow.com/questions/69076894
复制相似问题