定影器输出看起来不明确

定影器输出看起来不明确

我使用的fuser输出是这样的:

$ fuser / 
/:                    1354rc  1362r  1370rc  1371rc  1395rc  1399rc  1403rc  1410rc  1414rc  1428r  1451rc  1458rc  1470rc  1472rc  1477rc  1480rc  1487rc  1492rc  1500rc  1504rc  1508r  1513r  1516rc  1551r  1563rc  1567rc  1569rc  1586rc  1592rc  1629r  1630r  1633r  1645r  1660r  1695rc  1712rc  1728rc  1885r  2262rc  2273r  2585r  2602r  3342r  3799r

我理解这一点,但是当我通过管道连接wcnl出现问题时,输出看起来像这样。谁能告诉我为什么?

$ fuser / | nl
/:                  rcrrcrcrcrcrcrcrcrrcrcrcrcrcrcrcrcrcrcrrrcrrcrcrcrcrcrrrrrrcrcrcrrcrrrrrr
     1    1354  1362  1370  1371  1395  1399  1403  1410  1414  1428  1451  1458  1470  1472  1477  1480  1487  1492  1500  1504  1508  1513  1516  1551  1563  1567  1569  1586  1592  1629  1630  1633  1645  1660  1695  1712  1728  1885  2262  2273  2585  2602  3342  3799  4618

答案1

fusionr 的一部分发送到 stdout(标准输出),一部分发送到标准错误。

输出如何分割?

管道机制仅捕获标准输出。

普通定影器

mybox $ fuser /
/:                     350r   356r   357r   364r 10484rc 10485r

现在重定向,看到 pid 在 a 中,而文件类型(c 或 r)在 stderr 中。

mybox $ fuser / > a
/:                  rrrrrcr

文件“a”不以新行结尾。

mybox $ cat a
   350   356   357   364 10484 10485mybox $

现在重定向两者。

mybox $ fuser / > aa 2> bb

mybox $ cat aa
   350   356   357   364 10484 10485mybox $
mybox $ cat bb
/:                  rrrrrcr
  • 2>重定向stderr

在一个命令中同时传输这两个内容

mybox $ fuser / > cc 2>&1
mybox $ fuser / 2>&1 | wc
    1       8      71
mybox $ fuser / 2>&1 | nl
    1  /:                     350r   356r   357r   364r 10484rc 10485r 11761r
  • 2>&1“合并”stdoutstderr

为什么输出会分裂?

fusionr 的主要用途之一是杀死“持有”安装点的进程。

根据我上面的命令,您可以使用文件的内容来终止所有进程。

mybox $ fuser /foo/bar > a
/foo/bar:                  rrrrrcr

mybox $ cat a
   350   356   357   364 10484 10485mybox $
mybox $ kill $(<a)
  • $( ) 语法含义:文件 'a' 的内容

答案2

fusionr 被编写为将部分输出发送到 stdout,并将部分输出发送到 stderr。这样做有两个原因:

  1. 这意味着你可以将所有匹配的 pid 传送到另一个进程
  2. POSIX 标准是这么说的

这不是编写和调试某些内容的最简单方法,但它一直是一个长期存在的标准,所以喜欢或讨厌它,这就是它发送输出的方式。这意味着如果你通过管道或重定向它,你会得到很多 pid 或很多标志,但不能同时得到两者。

有关为什么会这样的更多详细信息,请参阅#166417

相关内容