Linux:在反引号中传递给 tar 的命令在一个系统上被替换,但在另一个系统上没有被替换:是什么导致了这种差异?

Linux: command passed to tar in backticks is replaced on one system but not the other: what could cause that difference?

我正在调试一个 shell-脚本,它在一个系统上工作正常但在另一个系统上失败。 该脚本本质上是解压缩和解压缩存档的日志文件,然后在包含的日志文件中为给定的子字符串进行 greps。

经过一些分析和调试,我现在发现在一个系统上,一个嵌入的 `basename $TAR_FILENAME` 命令被正确执行(即反引号之间的命令被执行并且结果替换了部分反引号之间的字符串),而在另一个系统上不会发生替换,而是插入字符串 `basename `(包括反引号)。这当然会破坏该字符串的进一步处理并且 grep 不起作用。

这可能是什么原因造成的?可以 enable/disable bash 中的反引号功能吗? 我不知道允许切换该功能的任何设置或开关 on/off。或者有没有?

后期补充: 这是脚本:

#!/bin/bash

pattern=
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:`基名./localhost_access_log.2021-07-29.txt`s:pattern

两个系统都在 SLES-11 上(非常老,确实...)。

tar 1.26 将命令传递给 shell (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 将此更改为跳过 shell 作为另一个修复的一部分 (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 中解释。

对于 tar 1.29,行为是 changed back