Redirecionando a saída do comando para o arquivo

1

Isso parece tão simples ao fazer isso a partir da linha de comando, mas não consigo realizá-lo dentro de um script. Eu estou tentando colocar saída do seguinte comando em um arquivo de texto:

CMD= mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
FIL=~/replication-'date +%F'.txt
MAILTEXT=~/mailtext.txt

touch $FIL
$CMD > $FIL

Onde FIL é uma variável que contém o caminho do arquivo para o qual o comando de saída. Estou executando este comando em um script de shell do qual desejo enviar por e-mail o conteúdo de $FIL como anexo usando mutt . Mas estou sempre recebendo 0 arquivo de byte. Além disso, se eu examinar no diretório, o arquivo é de 0 bytes de comprimento.

    
por TheVillageIdiot 19.09.2011 / 17:32

3 respostas

3

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:

  1. 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
    
  2. 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
    
por 19.09.2011 / 19:30
0

mudança:

CMD= mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'

para:

CMD="mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'"
    
por 19.09.2011 / 18:02
0

Eu criei um script semelhante que funciona:

FIL=~/test.txt
CMD="hostname"
touch $FIL
$CMD > $FIL

Você tentou sem o redirecionamento primeiro para ver se as saídas são geradas?

    
por 19.09.2011 / 18:03