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
相关产品推荐
相关产品推荐

