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
.