Похожий вопрос, но ответа нет:Как можно выполнить команду, хранящуюся в переменной?
Как сделать следующее в скрипте 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