Проблема не в перенаправлении, а в том, как вы храните команду в переменной. Во-первых, вы не можете поставить пробел после =
в назначении; с пробелом он устанавливает CMD пустым и запускает команду mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
, Если вы просто удалите пробел, он установит CMD на "mysql" и попытается выполнить команду -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
, Итак, как предложил @ Michał Šrajer, вы можете заключить его в двойные кавычки, чтобы все это было присвоено CMD. Но это все еще не работает, потому что, когда $CMD
раскрывается, он не обращает внимания на кавычки внутри него. Когда bash анализирует командную строку, он анализирует кавычки перед тем, как развернуть переменные, поэтому помещение кавычек в переменную ничего полезного не дает.
Хранить команду в переменной сложно. BashFAQ # 50 имеет хорошие обсуждения и варианты. В этом случае варианты, которые выглядят важными для меня:
Не помещайте команду в переменную в первую очередь. Если для этого нет веских причин, не делайте этого:
FIL=~/replication-`date +%F`.txt
MAILTEXT=~/mailtext.txt
touch $FIL
mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;' > $FIL
Если вы должны поместить команду в переменную, используйте массив вместо простой текстовой переменной. В этом случае кавычки будут проанализированы, когда переменная будет создана, и если вы используете ее как "${varname[@]}"
разрывы между "словами" будут сохранены:
CMD=(mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;')
FIL=~/replication-`date +%F`.txt
MAILTEXT=~/mailtext.txt
touch $FIL
"${CMD[@]}" > $FIL