O problema não é com o redirecionamento, é como você está armazenando o comando em uma variável. Primeiro, você não pode colocar um espaço após o =
na atribuição; com o espaço lá, ele define CMD em branco e executa o comando mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
. Se você simplesmente remover o espaço, ele definirá o CMD como "mysql" e tentará executar o comando -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
. Então, como sugeriu @ Michał Šrajer, você poderia envolvê-lo entre aspas duplas para que a coisa toda fosse atribuída ao CMD. Mas ainda não funciona, porque quando $CMD
é expandido, ele não presta atenção às citações dentro dele. Quando o bash analisa uma linha de comando, ele analisa aspas antes de expandir as variáveis, portanto, colocar as cotações dentro de uma variável não faz nada útil.
Armazenar um comando em uma variável é complicado. BashFAQ # 50 tem algumas boas discussões e opções. Nesse caso, as opções que parecem relevantes para mim são:
-
Não coloque o comando em uma variável em primeiro lugar. Se não há uma boa razão para isso, não faça:
FIL=~/replication-'date +%F'.txt MAILTEXT=~/mailtext.txt touch $FIL mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;' > $FIL
-
Se você precisar colocar o comando em uma variável, use uma matriz em vez de uma variável de texto simples. Nesse caso, as aspas serão analisadas quando a variável for criada e, se você usá-la como
"${varname[@]}"
, as quebras entre "palavras" serão preservadas:CMD=(mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;') FIL=~/replication-'date +%F'.txt MAILTEXT=~/mailtext.txt touch $FIL "${CMD[@]}" > $FIL