Bash 将stdin作为另一个文件添加到tar存档

Bash 将stdin作为另一个文件添加到tar存档,bash,deployment,pipe,tar,Bash,Deployment,Pipe,Tar,我正在尝试从程序输出向tar归档添加一个文件,而不首先在磁盘上生成它。设想一个文件版本,它是在构建脚本运行时自动生成的。我尝试了此操作,但取消引用的符号链接只是一个命名管道,不是常规文件: $ date +%s | \ tar cf test.tar \ --dereference \ --transform="s#/proc/self/fd/0#VERSION#" \ /proc/self/fd/0 \ other_files \ and_folde

我正在尝试从程序输出向tar归档添加一个文件,而不首先在磁盘上生成它。设想一个文件
版本
,它是在构建脚本运行时自动生成的。我尝试了此操作,但取消引用的符号链接只是一个命名管道,不是常规文件:

$ date +%s | \
  tar cf test.tar \
    --dereference \
    --transform="s#/proc/self/fd/0#VERSION#" \
    /proc/self/fd/0 \
    other_files \
    and_folders/
结果应该是一个文件
版本
,在tar存档中有一个时间戳,不在本地生成文件:

$ tar tf test.tar
VERSION
other_files
and_folders

我不知道如何在JAR存档中创建一个“假”文件条目。我会创建一个普通文件,将其添加到存档中,然后删除它


不过,您可能需要尝试选项
-A
(或
-串联
)。这将允许您在
/tmp
中创建文件,将其添加到TAR归档,然后在第二步中附加其余文件。通过这种方式,您可以为版本文件创建任意路径。

虽然
tar
确实适用于文件,但这并不意味着您必须自己创建临时文件,我建议您不要这样做

您可以使用进程替换(Bash支持这一点,Fish在a中也支持)


tar cvaf a.tgz谢谢!我现在就是这么做的。执行
mktemp
,使用
--transform=s/tempfile/VERSION/
将其添加到存档中,然后删除。我只是希望通过某种管道魔法使这一步更加简洁。这是唯一的方法,因为你不能通过管道给TAR文件名和内容
/proc/self/fd/0
不起作用,因为
tar
将链接归档为特殊文件,而不是扩展其内容。我还感到惊讶的是,在这种情况下,
--dereference
并没有关闭它。好吧,
--dereference
确实有一个效果:如果没有,打包的
/proc/self/fd/0
仍然是一个符号链接,它是一个命名管道(类型是
ls-F
附加了
)。但是打包管道的用途有限……这与我的
/proc
解决方案遇到的问题相同:
tar
打包管道,而不是普通文件。在解包时,它会显示:
$cat VERSION\ncat:VERSION:未找到文件或文件夹
@Boldewyn这在shell中往往是不同的。Fish使用
mkfifo
(例如
/tmp/.psub.O02RnmHZ5g
)创建实际命名管道,并且建议的方法可以完美地工作。Bash使用了一些神奇的文件,如
/dev/fd/63
。不幸的是,对于Bash中的进程替换,似乎没有内置的方法切换到
mkfifo
。很有趣!好的,那确实有效,但我一定要在这里痛击。
tar cvaf a.tgz <(echo 1.0.0) file1 file2 -P --transform 's:^/.*:VERSION:'