Как подавить вывод из тройника на основе переменной в Bash
Итак, в следующем примере:
echo "text to write to file but also not send to stdout" | tee -a $logfile 1> /dev/null
Вывод не распечатывается на терминале. Но когда я пытаюсь сделать то же самое действие, основанное на переменной, оно не работает.
Пример:
$loud=""
if [ -z $loud ]; then
route_devnull="1> /dev/null"
else
route_devnull=""
fi
echo "text to write to file but also not send to stdout" | tee -a $logfile $route_devnull
Как мне заставить работать второй пример? Или я должен попробовать другой способ подавления сообщений?
1 ответ
TL;DR: echo "text to write to file but also not send to stdout" | eval tee -a $logfile $route_devnull
bash
не оценивает переменные как команды. Ты можешь написать
echo "abc && touch new"
и он напечатает abc && touch new
в терминал. Это сделано специально, так как строки могут вводиться пользователями, и мы не хотим доверять их командам, поскольку они могут совершать вредоносные действия, например пытаться сломать наш компьютер.
Это где eval
приходит в.
Вместо того, чтобы сначала выполнить команду, eval читает и оценивает все аргументы для создания другой команды, а затем выполняет ее. Пример:
eval echo "abc && touch new"
Просто засунь eval
до того, что вы хотите оценить до исполнения. И под "просто пихать" я имею в виду "очень тщательно подумать об использовании eval
"