AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 747693
Accepted
wjwrpoyob
wjwrpoyob
Asked: 2023-06-01 07:10:02 +0800 CST2023-06-01 07:10:02 +0800 CST 2023-06-01 07:10:02 +0800 CST

为什么 tar 对 stdout 和 - 的处理不同?

  • 772

在OP 发表评论后,我发现/dev/stdout即使在禁用缓冲后也会提供 10 KiB 的块,但-不会。为什么是这样?man tar我在nor中找不到与此相关的任何信息man stdout。

请注意,/dev/stdout转到00002800,而不是000000a1。输出是正确的,除了用空字节填充。

> mkdir -p /tmp/747613
> cd /tmp/747613
> echo 747613 > file.txt

> tar czf /tmp/archive_tgz .
> hd /tmp/archive_tgz
00000000  1f 8b 08 00 00 00 00 00  00 03 ed d1 41 0a c2 30  |............A..0|
00000010  10 85 e1 ac 3d 45 4e 90  66 9a 49 72 9e 2e 22 08  |....=EN.f.Ir..".|
00000020  ea a2 46 f0 f8 a6 8b a2  9b 76 21 04 11 ff 6f f3  |..F......v!...o.|
00000030  20 33 90 81 e7 06 d3 9d  6f 72 8e 4b 4a 8e fe 3d  | 3......or.KJ..=|
00000040  57 46 54 43 6c 8f 69 6c  7b 22 da c6 36 f6 3f cd  |WFTCl.il{"..6.?.|
00000050  98 fb ad 4e b3 b5 2d cb  7c 9d 2e 65 7b 6f 7f fe  |...N..-.|..e{o..|
00000060  a3 dc 70 3c 9d 8b ab 8f  da ef 8f a5 e0 94 74 a7  |..p<..........t.|
00000070  ff bc f6 2f 41 a5 f5 1f  64 14 63 7d bf 93 5e fe  |.../A...d.c}..^.|
00000080  bc ff ac 39 49 38 7c fb  0c 00 00 00 00 00 00 00  |...9I8|.........|
00000090  00 00 00 00 00 00 1f 78  02 88 2a 27 ac 00 28 00  |.......x..*'..(.|
*
000000a1

> tar czf /dev/stdout . | hd
00000000  1f 8b 08 00 00 00 00 00  00 03 ed d1 41 0a c2 30  |............A..0|
00000010  10 85 e1 ac 3d 45 4e 90  66 9a 49 72 9e 2e 22 08  |....=EN.f.Ir..".|
00000020  ea a2 46 f0 f8 a6 8b a2  9b 76 21 04 11 ff 6f f3  |..F......v!...o.|
00000030  20 33 90 81 e7 06 d3 9d  6f 72 8e 4b 4a 8e fe 3d  | 3......or.KJ..=|
00000040  57 46 54 43 6c 8f 69 6c  7b 22 da c6 36 f6 3f cd  |WFTCl.il{"..6.?.|
00000050  98 fb ad 4e b3 b5 2d cb  7c 9d 2e 65 7b 6f 7f fe  |...N..-.|..e{o..|
00000060  a3 dc 70 3c 9d 8b ab 8f  da ef 8f a5 e0 94 74 a7  |..p<..........t.|
00000070  ff bc f6 2f 41 a5 f5 1f  64 14 63 7d bf 93 5e fe  |.../A...d.c}..^.|
00000080  bc ff ac 39 49 38 7c fb  0c 00 00 00 00 00 00 00  |...9I8|.........|
00000090  00 00 00 00 00 00 1f 78  02 88 2a 27 ac 00 28 00  |.......x..*'..(.|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002800

> # Even with buffering disabled
> stdbuf -i0 -o0 -e0 tar czf /dev/stdout . | stdbuf -i0 -o0 -e0 hd
00000000  1f 8b 08 00 00 00 00 00  00 03 ed d1 41 0a c2 30  |............A..0|
00000010  10 85 e1 ac 3d 45 4e 90  66 9a 49 72 9e 2e 22 08  |....=EN.f.Ir..".|
00000020  ea a2 46 f0 f8 a6 8b a2  9b 76 21 04 11 ff 6f f3  |..F......v!...o.|
00000030  20 33 90 81 e7 06 d3 9d  6f 72 8e 4b 4a 8e fe 3d  | 3......or.KJ..=|
00000040  57 46 54 43 6c 8f 69 6c  7b 22 da c6 36 f6 3f cd  |WFTCl.il{"..6.?.|
00000050  98 fb ad 4e b3 b5 2d cb  7c 9d 2e 65 7b 6f 7f fe  |...N..-.|..e{o..|
00000060  a3 dc 70 3c 9d 8b ab 8f  da ef 8f a5 e0 94 74 a7  |..p<..........t.|
00000070  ff bc f6 2f 41 a5 f5 1f  64 14 63 7d bf 93 5e fe  |.../A...d.c}..^.|
00000080  bc ff ac 39 49 38 7c fb  0c 00 00 00 00 00 00 00  |...9I8|.........|
00000090  00 00 00 00 00 00 1f 78  02 88 2a 27 ac 00 28 00  |.......x..*'..(.|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002800

> # Works fine (- means stdout)
> tar czf - . | hd
00000000  1f 8b 08 00 00 00 00 00  00 03 ed d1 41 0a c2 30  |............A..0|
00000010  10 85 e1 ac 3d 45 4e 90  66 9a 49 72 9e 2e 22 08  |....=EN.f.Ir..".|
00000020  ea a2 46 f0 f8 a6 8b a2  9b 76 21 04 11 ff 6f f3  |..F......v!...o.|
00000030  20 33 90 81 e7 06 d3 9d  6f 72 8e 4b 4a 8e fe 3d  | 3......or.KJ..=|
00000040  57 46 54 43 6c 8f 69 6c  7b 22 da c6 36 f6 3f cd  |WFTCl.il{"..6.?.|
00000050  98 fb ad 4e b3 b5 2d cb  7c 9d 2e 65 7b 6f 7f fe  |...N..-.|..e{o..|
00000060  a3 dc 70 3c 9d 8b ab 8f  da ef 8f a5 e0 94 74 a7  |..p<..........t.|
00000070  ff bc f6 2f 41 a5 f5 1f  64 14 63 7d bf 93 5e fe  |.../A...d.c}..^.|
00000080  bc ff ac 39 49 38 7c fb  0c 00 00 00 00 00 00 00  |...9I8|.........|
00000090  00 00 00 00 00 00 1f 78  02 88 2a 27 ac 00 28 00  |.......x..*'..(.|
*
000000a1
linux
  • 1 1 个回答
  • 583 Views

1 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2023-06-01T12:58:19+08:002023-06-01T12:58:19+08:00

    行为上的差异来自tar:写入时,它应用“阻塞因子”,默认情况下使用 10240 字节的记录(十六进制为 2800)。gzip即使在压缩时也会发生这种情况,这就是为什么某些 tarball 在提取时会产生错误消息的原因。当将存档写入常规文件或标准输出时,该行为在存档末尾被禁用(尽管手册说不是)。

    写入时/dev/stdout,tar相信它正在写入设备,并应用其阻塞因子。您可以通过更改阻塞因子来验证这一点:

    $ tar czfb /dev/stdout 1 . | hd
    00000000  1f 8b 08 00 00 00 00 00  00 03 ed d1 31 0e 83 30  |............1..0|
    00000010  0c 05 50 cf 9c 22 27 08  76 b0 e3 f3 74 48 25 24  |..P.."'.v...tH%$|
    00000020  26 08 88 e3 03 43 55 c4  00 53 8a 2a fc 16 0f b6  |&....CU..S.*....|
    00000030  e4 2f 7d 5f 43 71 b8 52  91 6d 92 0a ee e7 07 10  |./}_Cq.R.m......|
    00000040  73 13 31 10 62 04 24 0c  2c e0 a4 7c 34 80 71 c8  |s.1.b.$.,..|4.q.|
    00000050  af de 39 18 72 9a d2 c9  dd d5 fe 4f f9 fa dd 76  |..9.r......O...v|
    00000060  c9 e7 39 97 fb b1 15 1c  99 4f fa d7 43 ff a4 21  |..9......O..C..!|
    00000070  80 c3 72 91 be 1e de bf  b2 46 6a aa bb 63 18 63  |..r......Fj..c.c|
    00000080  8c f9 b1 05 02 0c 89 df  00 0a 00 00 00 00 00 00  |................|
    00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00000200
    
    • 8

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve