qual é a diferença entre & 2 e & 2 [duplicado]

1

Está apenas a pensar se existe alguma diferença entre:

  echo "running the npm patch" >&2;

e

 echo "running the npm patch" &>2;

Eu realmente nunca entendi essa sintaxe.

    
por Alexander Mills 15.05.2018 / 02:54

1 resposta

4

Leia atentamente a seção "Redirecionamento" do manual: link

A forma cmd >&2 é descrita na seção "3.6.8 Descrevendo descritores de arquivos"

[n]>&word

Aqui, n não é especificado, então o padrão é "1" significando stdout: estamos redirecionando stdout para o descritor de arquivo "2" significando stderr. Toda saída normal do comando será enviada para stderr.

A forma cmd &>2 é descrita na seção "3.6.4 Redirecionando a saída padrão e o erro padrão"

There are two formats for redirecting standard output and standard error:

&>word

and

>&word

Of the two forms, the first is preferred. This is semantically equivalent to

>word 2>&1

Neste caso, "word" é "2", então temos stdout e stderr do comando sendo enviado para um arquivo chamado 2 .

$ sh -c 'echo stdout; echo stderr >&2' &>2
$ ls -l 2
-rw-rw-r-- 1 jackman jackman 14 May 14 21:40 2
$ cat 2
stdout
stderr

Eu achei isso tudo muito confuso quando eu estava aprendendo. Continue assim. Lembre-se de que os redirecionamentos ocorrem na ordem estrita da esquerda para a direita. Por exemplo

$ sh -c 'echo stdout; echo stderr >&2' >&2 2>some.file
stdout
$ cat some.file
stderr

Por que a string "stdout" não é enviada para esse arquivo?

Da esquerda para a direita:

  • 1>&2 - Penso nisso como "descritor de arquivo de redirecionamento 1 para qualquer que seja o descritor de arquivo 2 atualmente em uso ". Atualmente, fd 2 aponta para / dev / stderr. Então, agora, o fd 1 também aponta para / dev / stderr.
  • 2>some.file - Alteramos o fd 2 para gravar no arquivo nomeado. Isso faz não alterar o que o fd 1 está usando atualmente.

Se tivéssemos de alterar a ordem dos redirecionamentos, obteríamos um resultado diferente:

$ sh -c 'echo stdout; echo stderr >&2' 2>some.file >&2
$ cat some.file 
stdout
stderr

Porque nós mudamos fd 2 primeiro . Então redireciona o fd 1 para qualquer fd 2 que esteja atualmente usando .

Note que a minha terminologia está provavelmente errada ("aponte para", etc). É assim que me lembro como os redirecionamentos funcionam.

    
por 15.05.2018 / 03:40