Como armazenar '>&2' em uma variável

Como armazenar '>&2' em uma variável

Pergunta semelhante, mas sem resposta:Como podemos executar um comando armazenado em uma variável?

Como fazer o seguinte no script bash?

error=">&2"
echo 'something went wrong' $error

em vez de

echo 'something went wrong' >&2

Por que?
Porque se você digitar como >2&, ele funciona normalmente, mas grava mensagens de erro em um arquivo chamado 2.

Responder1

Como eles disseram nos comentários, você não sabe, realmente.

Bem, você poderia fazer isso com eval, mas teria problemas em citar/escapar tudooutronessa linha de comando.

Porém, há algumas coisas que você pode fazer com funções: executar um determinado comando simples sob um redirecionamento; ou apenas escrever uma mensagem para stderr:

#!/bin/bash
tostderr() {
        "$@" >&2
}

warn() {
        local IFS=" "
        printf "%s\n" "$*" >&2
}

tostderr printf "warning: %s\n" "something happened"

warn another thing to warn about

Ênfase nosimplescomando no primeiro, não é evale você não pode ter sintaxe de shell dentro do comando. Por exemplo, tostderr foo | barele redireciona a saída de apenas foo(além do pipe para stderr) e tostderr (foo | bar)não funciona.


Se você estivesse no zsh e realmente quisesse, poderia usar um alias global para adicionar o redirecionamento (mas alguns podem pensar que isso está beirando a codificação ofuscada):

#/usr/bin/zsh

alias -g TOSTDERR='>&2'
echo something bad happened TOSTDERR

informação relacionada