请注意我不是问如何。我已经知道像pv
和 之类的选项rsync -P
。
我想问一下为什么没有cp
实现进度条,至少作为一个标志?
答案1
Unix 工具的传统是仅在出现问题时才显示消息。我认为这既有设计原因,也有实际原因。该设计的目的是在出现问题时使其显而易见:您会收到一条错误消息,并且它不会淹没在非实际信息的消息中。实际原因是,在 UNIX 的早期,仍然有电传打字机;也就是说,程序的输出将打印在纸上,并且您不想打印进度条。
不管出于什么原因,只显示有用消息的传统已经在 UNIX 世界中根深蒂固。现代工具有时会引入进度条;就 rsync 而言,主要动机是 rsync 通常通过网络执行,而网络比本地磁盘脆弱得多,因此进度条更有用。同样的推理也适用于 wget。
答案2
在 UNIX 世界中,每个工具都被设计为完成一项工作并且做得很好。当另一个类似的工具已经输出进度时,为什么还要cp
担心输出进度呢?pv
同样,为什么这么多程序将内容转储到屏幕上而不进行任何分页?因为已经有适合这项工作的工具,例如more
(或less
)。为什么大多数需要编辑文件的程序不向您提供编辑器而是外包给您$EDITOR
?因为这使得每个人都只能完成他们设计要做的一项任务,而用户则使用他们最喜欢的编辑器来完成所有任务。
顺便说一句,大多数 shell 程序都被设计为将其输出通过管道输送到其他 shell 程序中。他们可能给出的唯一输出是在链中的下一个命令中解析出有用的东西。类似的程序cp
可以在脚本中使用,也可以从终端手动使用,因此其输出主要围绕退出代码和失败或成功的文件列表。
始终期望结合使用工具来实现您想要的效果。
答案3
这是那些支持和反对向 cp 添加进度条选项的边缘事物之一。反对的主要论点是,您可能无法提前知道您想了解进度。 Ctrl-T/SIGINFO 在 BSD 上可用于此目的,如果在 GNU/Linux 平台上可用,那么可能有更多理由触发 cp 中的进度条逻辑。与此同时,更通用的解决方案是使用单独的工具,例如这Coreutils 进度查看器( progress
,以前称为cv
)显示系统上任何进程的状态。