cp a b
和cat a > b
,有什么区别?
在linux内核源代码树的x86安装脚本中arch/x86/boot/install.sh
,两者都被使用:
cat $2 > $4/vmlinuz
cp $3 $4/System.map
如果一种格式比另一种更好,为什么他们不保持相同的格式呢?
答案1
我想到了另一个问题,其中cat
vscp
产生了显着的差异:
根据定义, cat 将扩展稀疏文件,用“真正的”零字节填充间隙,而 cp 至少可以被告知保留这些漏洞。
稀疏文件是其中零字节序列已被元数据替换以保留空间的文件。您可以通过使用 dd 创建一个来进行测试,然后使用您选择的工具复制它。
创建一个稀疏文件(提前更改为 /tmp 以避免出现问题 - 请参阅最后的注释):
15> cd /tmp 16> dd if=/dev/null of=sparsetest bs=512b seek=5 0+0 records in 0+0 records out 0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
调整它的大小 - 它不应该占用任何空间。
17> du -sh sparsetest 0 sparsetest
用 cp 复制并检查大小
18> cp sparsetest sparsecp 19> du -sh sparsecp 0 sparsecp
现在用 cat 复制它并检查大小
20> cat sparsetest > sparsecat 21> du -sh sparsecat 1.3M sparsecat
尝试您喜欢的工具来检查他们的行为
别忘了清理。
最后要注意的是:如果您在本地系统管理员备份计划的一部分或对系统的健康至关重要的文件系统上进行此类实验,那么这些实验就有可能提高您在本地系统管理员中的声誉。根据他选择的备份工具,他最终可能需要比他想象的更多的磁带介质来备份那个扩展到 TB 的零的 0 字节文件。
其他既不能用 cat 也不能用 cp 复制的文件包括设备专用文件等。这取决于复制工具的实现,它是否能够复制设备节点,或者是否会愉快地复制其内容。
答案2
根据基思的评论,cp
保留一些权限,并cat
按照指示创建新文件umask
。所以$2
的权限不会被保留,这$4/vmlinuz
是非常干净的,而如果在 上设置了一些奇怪的权限$3
,$4/System.map
则会保留它。
答案3
在这两种情况下,两者具有相同的功能,但 cp 纯粹是文件操作。 “拿着这个文件并在那里复制一份”。
另一方面,cat 的目的是将文件的内容转储到控制台。 “获取此文件并将其显示在屏幕上”,然后让忍者攻击屏幕并将输出重定向到其他地方。
cp 通常会更有效,因为没有重定向,只是将字节从位置 A 直接复制到位置 B。
猫会是read bytes -> output to console -> intercept output -> redirect to new file
。
答案4
cat
在一些 Makefiles/脚本中随处可见,这让我浪费时间,因为cat
在没有给出输入文件时变得交互式。也可以浪费真钱当构建工具长时间停滞时。
用OP的例子来说明:
让我们假设$2
和$3
是空 shell 字符串(出于任何不好的原因 :\ ):
cat $2 > $4/vmlinuz # waits forever
cp $3 $4/System.map # returns an error immediately
我现在倾向于在可能的情况下使用cp
or install
over cat
。
那里有有趣的答案和评论,谢谢!