Tcl中带有名称模式的tar命令无法工作

3

当我尝试在tcl中运行此命令时:

tar -zcvf input.scs__pmos.sdevv.tar.gz input.scs*

我收到了这个信息:
/bin/tar: input.scs*: Cannot stat: No such file or directory
/bin/tar: Error exit delayed from previous errors

child process exited abnormally
while executing

然而,当我在Perl / shell中运行时,我会得到以下结果:
perl -e 'system("tar -zcvf input.scs__pmos.sdevv.tar.gz input.scs*")'

我理解的是:

input.scs
input.scs~

为什么Tcl会造成这种情况?在Linux Shell中运行会得到相同的结果。

我使用的是Tcl 8.5版本。


使用Perl时,当您使用单个字符串与system一起使用时,Perl将生成一个shell(我认为是/bin/sh)并将字符串发送到shell。然后shell负责扩展glob模式。Tcl的等效命令是exec /bin/sh -c "tar -zcvf input.scs__pmos.sdevv.tar.gz input.scs*" - glenn jackman
1个回答

6

Tcl默认不会自动展开文件名通配符(*),这是有意设计的。如果你想展开它,必须明确地要求展开(记住展开后会生成一个文件名列表,所以我们需要使用{*}[...]而不仅仅是[...]):

exec tar -zcvf input.scs__pmos.sdevv.tar.gz {*}[glob input.scs*]

添加exec是很好的习惯;只有在交互模式下,你才可以完全省略它,这只是一种方便功能。你的脚本需要它,所以现在就养成好习惯吧。


如果你仍在使用 Tcl 8.4 或更早版本,请跟上潮流并升级。8.4 版本已经连 安全 支持都停止了几年;除了 8.4.20 版本之外,任何可能存在的错误都将不会得到修复。 - Donal Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接