error = $ (mkdir test 2 & 1) Qual é o significado dessa expressão?

4

Eu tenho o seguinte script de shell:

error=$(mkdir test 2>&1)

Eu sei que a variável 'error' irá obter o resultado do erro do comando mkdir se houver um erro, mas não consigo entender como 2 > & 1 funciona, alguém poderia explicar? Obrigado!

    
por Patterson 21.09.2016 / 19:53

3 respostas

10

A sintaxe

x="$(some_command)"

executará some_command e a saída disso é retornada e armazenada na variável "$x" .

Agora, normalmente, os programas enviam "saída normal" para o fluxo "saída padrão" ( stdout , identificador de arquivo # 1) e mensagens de erro para o fluxo "erro padrão" ( stderr , identificador de arquivo # 2) .

O redirecionamento semântico 2>&1 significa (grosso modo, é um pouco mais complicado nas capas) "enviar stderr para stdout ". Então mensagens de erro e mensagens de saída são misturadas.

Assim, podemos combinar os dois:

x="$(some_command 2>&1)"

retornará a saída e as mensagens de erro e as colocará em $x .

No seu caso

error="$(mkdir test 2>&1)"

significa que $error conterá a saída (que está vazia) e o erro (que pode conter uma string se ocorrer um erro). O resultado é que $error conterá qualquer mensagem de erro do comando mkdir .

Podemos ver isso em ação.

$ error="$(mkdir /)"
mkdir: cannot create directory '/': File exists
$ echo "$error"

$ error="$(mkdir / 2>&1)"
$ echo "$error"
mkdir: cannot create directory '/': File exists

No primeiro caso, a mensagem de erro é impressa imediatamente porque é enviada para stderr e a variável está vazia. No segundo caso, redirecionamos o stderr para o stdout e, portanto, ele é capturado e armazenado na variável $error .

    
por 21.09.2016 / 19:59
2

Isso significa, poeticamente falando: enviar o fluxo de erro para o mesmo "canal" que a saída normal. 2 significa erro (s). 1 é a linha principal ou a saída padrão . &1 indica o caminho, aonde a saída padrão vai. Por padrão, ele vai para a tela e, nesse contexto de substituição: $( ) , vai para a variável, torna-se seu valor. E > é redirecionamento. Todos juntos 2>&1 significa: redirecionar erros o caminho da saída padrão.

    
por 21.09.2016 / 19:57
1

Ele captura stderr e stdout, redirecionando stderr para stdout (entrando em vigor após a substituição do comando $() ter conectado stdout a um pipe ao shell pai).

O & em >&1 faz a diferença entre referenciar outro descritor de arquivo, em vez de abrir um arquivo chamado 1 .

O 2> significa redirecionar o stderr, como de costume.

    
por 22.09.2016 / 02:14