以下命令如何工作?
pv file.tar.gz | tar -xz
Run Code Online (Sandbox Code Playgroud)
根据我的理解,管道运算符|
创建 apipe
和stdout
ofpv
映射到O_WRONLY
管道的末尾,tar
'sstdin
映射到O_RDONLY
with bothO_WRONLY
和O_RDONLY
existing inpipefs
这一切都很好,但以下内容正在打印到我的屏幕上:
31.1MiB 0:00:05 [6.17MiB/s] [===================================>] 100%
Run Code Online (Sandbox Code Playgroud)
据我所知,这个进度条不是由生成的,tar
因为如果它是并且我不需要它,它可以通过一个选项获得pv
,因此pv
必须生成它。但是如何? pv
的stdout
映射到O_WRONLY
.
我还读到一些 shell 使用套接字对代替管道,pipefs
并且套接字对是双向的。但这似乎会占用stdin
和stdout
两个命令,直到一个或两个命令完成。在上面的例子中不是这种情况,因为进度条是实时更新的。
进度条是 的一个特性pv
,它写在标准错误上。从pv
手册:
pv 通过提供诸如已用时间、完成百分比(带进度条)、当前吞吐率、传输的总数据量和 ETA 等信息来显示数据在管道中的进度。
要使用它,请将其插入两个进程之间的管道中,并使用适当的选项。它的标准输入将传递到其标准输出,进度将显示在标准错误上。
虽然同时重定向标准输出和标准错误,但写入 TTY 确实没有问题:
$ ( echo "out"; echo "error" >&2; echo "hi there" >$(tty) ) 2>&1 | cat >file
hi there
$ cat file
out
error
Run Code Online (Sandbox Code Playgroud)
此外,O_WRONLY
andO_RDONLY
不是名词而是形容词。标准输出是只写的,标准输入是只读的。
归档时间: |
|
查看次数: |
1499 次 |
最近记录: |