Итак, в следующем примере:
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
"