Esto parece tan simple cuando lo hago desde la línea de comandos, pero no puedo lograrlo dentro de un script. Estoy tratando de poner la salida del siguiente comando en un archivo de texto:
CMD= mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
FIL=~/replication-`date +%F`.txt
MAILTEXT=~/mailtext.txt
touch $FIL
$CMD > $FIL
Donde FIL
es una variable que contiene la ruta del archivo al que se envía el comando. Estoy ejecutando este comando en un script de shell desde donde quiero enviar contenido por correo electrónico $FIL
como adjunto usando mutt
. Pero siempre obtengo un archivo de 0 bytes. Además, si examino en el directorio, el archivo tiene una longitud de 0 bytes.
linux
bash
ubuntu-10.04
redirection
TheIdiot de la aldea
fuente
fuente
CMD
no funcionará, deshacerse del espacio después=
y rodear los valores con comillas dobles:sh
es extremadamente extraño en su tratamiento del espacio en blanco.Respuestas:
El problema no está en la redirección, sino en cómo está almacenando el comando en una variable. Primero, no puedes poner un espacio después
=
de la asignación; con el espacio allí, establece CMD en blanco y ejecuta el comandomysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
. Si solo elimina el espacio, configurará CMD en "mysql" e intentará ejecutar el comando-uroot -psecret -e 'SHOW SLAVE STATUS \G;'
. Entonces, como sugirió @ Michał Šrajer, podría envolverlo entre comillas dobles para que todo se asigne a CMD. Pero todavía no funciona, porque cuando$CMD
se expande, no presta atención a las citas dentro de él. Cuando bash analiza una línea de comando, analiza las comillas antes de expandir las variables, por lo que poner comillas dentro de una variable no hace nada útil.Almacenar un comando en una variable es complicado. BashFAQ # 50 tiene algunas buenas discusiones y opciones. En este caso, las opciones que me parecen relevantes son:
No pongas el comando en una variable en primer lugar. Si no hay una buena razón para ello, no lo hagas:
Si debe poner el comando en una variable, use una matriz en lugar de una variable de texto simple. En este caso, las comillas se analizarán cuando se cree la variable y, si la usa, se conservarán
"${varname[@]}"
los saltos entre "palabras":fuente
#!/bin/bash
.cambio:
a:
fuente
He creado un script similar que funciona:
¿Intentó sin la redirección primero, para ver si las salidas se generan en absoluto?
fuente