Как подавить вывод из tee на основе переменной в Bash

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

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