2

我正在使用 Perl 的Archive::Tar模块。它保留了文件权限,但不保留粘性位。在我提取档案的另一端,所有的粘性位都消失了。我认为 UNIX/LINUX 操作系统将这些粘性位存储在其他地方。我怎样才能让我的档案也保留粘性位?

使用 -p 开关 tar 保留它,但我如何使用Archive::Tar来做到这一点?我在两边都使用 Perl 的模块。

4

3 回答 3

4

根据 Fine Source,Archive::Tar::File 会从模式中去除高位。您可以在脚本的开头尝试以下魔法咒语(在任何可能引用 Archive::Tar 之前),看看是否会破坏它:

use Archive::Tar::Constant ();
BEGIN {
    local $SIG{__WARN__} = sub{};
    *Archive::Tar::Constant::STRIP_MODE = sub(){ sub {shift} };
}
...
use Archive::Tar;
...

简要说明:STRIP_MODE 是一个常量,包含一个可以传递原始模式并返回应该存储的模式的子程序。它通常设置为

sub { shift() & 0777 }

因为它是一个常量,从 Archive::Tar::Constant 导入到 Archive::Tar::File 并在那里使用,所以无论它设置什么都将在编译时内联到 Archive::Tar::File 中。所以要改变它,常量必须在它被内联之前改变,也就是说,在 Archive::Tar::File 被加载之前。

NB 因为更改可内联常量容易出错(在太晚而没有任何效果之后更改它),它通常会生成一个无法通过常规方式禁用的严重警告。

于 2009-02-24T08:40:35.357 回答
0

不确定,但是在官方的 tar 命令上,您需要通过-p来实现这一点

于 2009-02-24T06:25:55.697 回答
-1

您可能想查看Archive::Tar 文档以了解详细信息。乍一看,似乎

$Archive::Tar::CHMOD = 1;

应该做你想做的事,尽管文档声称上述设置是默认设置。可能是 Archive::Tar 像粘性位一样剥离了高阶模式位。

归档文件是使用 Archive::Tar 创建和提取的,还是您在一端或另一端使用标准 tar 程序?

于 2009-02-24T07:06:01.123 回答