Por que precisamos ter 2 & 1 em / dev / null 2 & 1?

1

Eu vi no script linux havia um argumento de comando > /dev/null 2>&1 , eu sei que é redirecionar a saída para null, significa silenciando-o. Eu também sei sobre a numeração de 0,1,2 (STDIN, STDOUT, STDERR), mas não entendo por que preciso ter essa linha?

2>&1

Basicamente, quero saber qual é a diferença entre

>/dev/null

e

>/dev/null 2>&1
    
por hades 04.03.2016 / 04:55

2 respostas

7

2>&1 redirecionará stderr para onde o stdout apontar atualmente. O argumento >/dev/null redirecionará o stdout para /dev/null , ou seja, descarta / silenciosamente a saída pelo comando. Mas se você também quiser descartar (tornar silencioso) o stderr, depois de redirecionar o stdout para /dev/null , especifique 2>&1 para redirecionar o stderr para o mesmo local.

Exemplo (para visualizar a diferença):

$ ls
file1
file2

$ ls file1 > /dev/null
$

Aqui, a saída de ls file1 é file1 , que é enviada para /dev/null e, portanto, não recebemos nada. Mas:

$ ls file12 > /dev/null
ls: cannot access file12: No such file or directory

que dá stderr e como apenas a saída é enviada para /dev/null . Então, Se você quiser descartar / stderr silencioso, também poderá redirecionar stderr para stdout e, portanto, ambos serão enviados para /dev/null da seguinte forma:

$ ls file12 >/dev/null 2>&1
$

Note que a ordem / sequência de redirecionamento é importante. 2>&1 para redirecionar o erro padrão deve sempre ser colocado após redirecionar a saída padrão ou não faz nada. No exemplo acima, se você executar ls file12 2>&1 >/dev/null , verá o stderr impresso no terminal; se você executar ls file12 >/dev/null 2>&1 você não irá.

  • Como alternativa, você também pode usar ls file1 file12 2>/dev/null 1>&2 com o mesmo efeito - que primeiro redireciona stderr para /dev/null e redireciona o stdout para apontar para o mesmo local para o qual o stderr está apontando atualmente.
  • Com a nova versão do bash, você também pode usar >& , da mesma forma que: ls file12 >& /dev/null , que redirecionará stdout & stderr para /dev/null
por 04.03.2016 / 07:03
2

someprogram > /dev/null 2>&1 funciona redirecionando a saída padrão ( &1 ) para /dev/null e, em seguida, redireciona o erro padrão ( &2 ) para o mesmo local para o qual &1 foi redirecionado. Se você também não redirecionar o stderr, enquanto a saída padrão for eliminada, o erro padrão ainda será enviado ao terminal.

    
por 04.03.2016 / 04:57