首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux:在一个系统上用反引号传递给tar的命令被替换了,但在另一个系统上却没有:是什么导致了这种差异?

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

Stack Overflow用户
提问于 2021-09-06 15:21:02
回答 1查看 64关注 0票数 1

我正在调试一个shell脚本,它在一个系统上运行良好,但在另一个系统上却失败了。该脚本本质上是解压缩和解压归档的日志文件,然后对所包含的日志文件中给定子字符串进行greps。

经过一些分析和调试,我现在发现,在一个系统上,一个嵌入的basename $TAR\_FILENAME命令被正确执行(即,反划线之间的命令被执行,结果替换了反划线之间的字符串的一部分),而在另一个系统上,这种替换没有发生,而是插入了字符串basename <filename-here> (包括反划线)。当然,这会破坏对该字符串的进一步处理,grep也无法工作。

是什么导致了这种情况?可以启用/禁用bash中的反勾号功能吗?我不知道有任何设置或开关可以打开/关闭该功能。还是真的有?

稍后添加:脚本如下:

代码语言:javascript
复制
#!/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上(非常旧,确实...)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-06 17:29:25

tar 1.26将命令传递给外壳程序(source):

代码语言:javascript
复制
  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)的一部分的外壳:

代码语言:javascript
复制
  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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69076894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档