Как сохранить '>&2' в переменной

Как сохранить '>&2' в переменной

Похожий вопрос, но ответа нет:Как можно выполнить команду, хранящуюся в переменной?

Как сделать следующее в скрипте bash?

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

вместо

echo 'something went wrong' >&2

Почему?
Потому что если вы напечатаете его как >2&, он будет работать нормально, но запишет сообщения об ошибках в файл с именем 2.

решение1

Как и было сказано в комментариях, на самом деле это не так.

Ну, вы можете сделать это с помощью eval, но у вас возникнут проблемы с цитированием/экранированием всегоещев этой командной строке.

Однако есть некоторые вещи, которые можно делать с помощью функций: выполнить заданную простую команду с перенаправлением или просто записать сообщение в 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

Акцент напростойкоманда на первом, это не так eval, и вы не можете иметь синтаксис оболочки внутри команды. Например, в tostderr foo | barон перенаправляет вывод just foo(мимо конвейера в stderr), и tostderr (foo | bar)не будет работать.


Если бы вы работали на zsh и действительно этого хотели, вы могли бы использовать глобальный псевдоним для добавления перенаправления (но некоторые могут подумать, что это граничит с запутанным кодированием):

#/usr/bin/zsh

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

Связанный контент