我使用的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
我理解这一点,但是当我通过管道连接wc
或nl
出现问题时,输出看起来像这样。谁能告诉我为什么?
$ 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
“合并”stdout
和stderr
为什么输出会分裂?
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。这样做有两个原因:
- 这意味着你可以将所有匹配的 pid 传送到另一个进程
- POSIX 标准是这么说的
这不是编写和调试某些内容的最简单方法,但它一直是一个长期存在的标准,所以喜欢或讨厌它,这就是它发送输出的方式。这意味着如果你通过管道或重定向它,你会得到很多 pid 或很多标志,但不能同时得到两者。
有关为什么会这样的更多详细信息,请参阅#166417