saída do fusor parece ambígua

1

Estou usando fuser a saída é assim:

$ 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

Eu entendo isso, mas quando eu canalizo para wc ou nl , algo dá errado que a saída se parece com isso. Alguém pode me dizer por quê?

$ 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
    
por amir jj 15.09.2014 / 13:15

2 respostas

2

parte do fusor é enviada para stdout (saída padrão) e parte para erro padrão.

como a saída é dividida?

mecanismo de tubulação somente captura stdout.

fusor simples

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

agora redirecionando, veja pid em um, enquanto o tipo de arquivo (c ou r) está em stderr.

mybox $ fuser / > a
/:                  rrrrrcr

o arquivo "a" não termina com uma nova linha.

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

agora redirecionando ambos.

mybox $ fuser / > aa 2> bb

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

para canalizar ambos em um comando

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 "mesclar" stdout e stderr

por que a saída é dividida?

um dos principais usos do fusor é matar o ponto de montagem "holding" do processo.

do meu comando acima, você poderia usar o conteúdo de um arquivo para matar todo o processo.

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

mybox $ cat a
   350   356   357   364 10484 10485mybox $
mybox $ kill $(<a)
  • $ () significa sintaxe: conteúdo do arquivo 'a'
por 15.09.2014 / 13:27
1
O

fuser foi gravado para enviar parte da saída para stdout e parte da saída para stderr. Isso foi feito por dois motivos:

  1. Isso significa que você pode canalizar todos os pids correspondentes para outro processo
  2. O padrão POSIX disse assim

Não é a maneira mais fácil de escrever e depurar algo, mas tem sido um padrão de longa duração, então ame ou odeie isso, é assim que ele envia sua saída. Isso significa que, se você redirecionar ou redirecionar, obterá muitos pids ou muitos flags, mas não os dois.

Para mais detalhes sobre por que é assim, veja # 166417

    
por 18.11.2015 / 08:48