You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SLES-11系统下tar命令反引号命令替换效果差异原因咨询

问题原因分析
  • 两台设备上tar命令对--to-command参数的执行逻辑存在差异。GNU tar的标准实现会将--to-command后的参数作为命令字符串,默认调用/bin/sh -c执行,这一步会触发反引号的命令替换;如果其中一台设备的tar包版本较低、或者采用非GNU实现(比如bsdtar),可能会直接将参数作为可执行文件名+参数传递给exec系统调用,不会经过shell解析,因此反引号会原样输出。
  • 两台设备的/bin/sh指向的默认shell不同。SLES 11支持配置/bin/sh的指向,若其中一台指向bash,另一台指向了极简实现的shell(如早期版本的dash、ash),部分精简shell对反引号命令替换的支持存在兼容问题,也会导致解析失败。
  • tar命令运行环境的shell配置存在差异。如果tar调用的shell开启了POSIX严格模式、或者禁用了命令替换相关的扩展选项,也会导致反引号不会被解析执行。
验证方法
  • 分别在两台设备执行tar --version,确认tar的版本和实现类型是否一致
  • 执行ls -l /bin/sh确认默认shell的指向是否相同
  • 修改脚本中--to-command参数为'echo $0',运行后查看输出的shell类型
修复方案

建议将命令替换逻辑显式指定由bash解析,避免默认环境差异的影响,同时使用兼容性更好的$()代替反引号实现命令替换,修改后的脚本参考:

#!/bin/bash

pattern=$1
for f in *.tar.gz; do
     echo "$f:"
     tar -xzf "$f" --to-command "bash -c 'echo \"f:\$(basename \$TAR_FILENAME) s:$pattern\"'"
done

内容的提问来源于stack exchange,提问作者mmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:45:03