Как подавить вывод из тройника на основе переменной в 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 "

Другие вопросы по тегам