加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash“wc -l”命令输出在呼叫或通过tee时有所不同

发布时间:2020-12-16 01:37:28 所属栏目:安全 来源:网络整理
导读:当我在 Bash中发出两个等效命令时,我得到了不同的输出(来自“wc -l”命令),见下文: root@devel:~# ls /usr/bin -lha | tee (wc -l) (head) /dev/nulltotal 76Mdrwxr-xr-x 2 root root 20K Nov 11 18:58 .drwxr-xr-x 10 root root 4.0K Oct 8 15:31 ..-rwxr-
当我在 Bash中发出两个等效命令时,我得到了不同的输出(来自“wc -l”命令),见下文:
root@devel:~# ls /usr/bin -lha | tee >(wc -l) >(head) > /dev/null
total 76M
drwxr-xr-x  2 root root      20K Nov 11 18:58 .
drwxr-xr-x 10 root root     4.0K Oct  8 15:31 ..
-rwxr-xr-x  1 root root      51K Feb 22  2017 [
-rwxr-xr-x  1 root root       96 Jan 19  2017 2to3-3.5
-rwxr-xr-x  1 root root      23K Mar 22  2017 addpart
lrwxrwxrwx  1 root root       26 May 10  2017 addr2line -> x86_64-linux-gnu-    addr2line
lrwxrwxrwx  1 root root        6 Dec 13  2016 apropos -> whatis
-rwxr-xr-x  1 root root      15K Sep 13 19:47 apt
-rwxr-xr-x  1 root root      79K Sep 13 19:47 apt-cache
137
root@devel:~# ls /usr/bin -lha | wc -l
648

我错过了什么?

这很奇怪,但是当我以这种方式调用它时,它会输出更奇怪的输出:

root@devel:~# ls /usr/bin -lha | tee >(wc) >(wc) > /dev/null
648    6121   39179
648    6121   39179
root@devel:~# ls /usr/bin -lha | tee >(wc) >(wc) > /dev/null
648    6121   39179
648    6121   39179
root@devel:~# ls /usr/bin -lha | tee >(wc) >(wc -l) > /dev/null
648
root@devel:~#     648    6121   39179

看起来像异步运行的命令,并在不同的时间结束……或者它可以是什么?

简单回答:

怎么修:

ls /usr/bin -lha | tee --output-error=exit-nopipe >(wc -l) >(head) > /dev/null

细节:

命令头只打印输入的头部,因此只要输入足够就可以完成其工作,然后退出而不等待所有输入.

所以让我们用简单的“头”代替命令头.

ls /usr/bin -lha | tee >(wc -l) >(read l; echo $l) > /dev/null

简单的“head”将只读取一行,然后退出,这导致管道文件在tee完成将所有数据传输到它之前立即关闭.

所以毫无疑问,你会得到与简单的“头”相同的结果. wc仍然打印错误的号码.

你认为你问题的根本原因是,tee的输出管道之一先前关闭,tee遇到写入错误,然后停止写入其他输出文件.

在理解了根本原因之后,我认为您将很容易理解手册页中的以下部分.

MODE determines behavior with write errors on the outputs:
   'warn' diagnose errors writing to any output

   'warn-nopipe'
          diagnose errors writing to any output not a pipe

   'exit' exit on error writing to any output

   'exit-nopipe'
          exit on error writing to any output not a pipe

   The  default MODE for the -p option is 'warn-nopipe'.  The default operation
   when --output-error is not specified,is to exit immediately on error writing to
   a pipe,and diagnose errors writing to non pipe outputs.

一些额外的话

其实,如果你更换>(WC-1)在你的问题的命令行中一个普通的文件,你会发现文件大小将始终是16384或20480或32768或36864或28672或……,所有这些都是多4096.(对常规文件的写入不完整,因为tee早先中止.如果写入完成,文件大小将是任何值.)

对于大多数类UNIX系统,4096是PIPE_BUF的值.如果您知道PIPE_BUF是什么,您将很容易理解为什么文件大小始终是4096的倍数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读