¿Cómo puedo reescribir este comando para enviar solo por correo electrónico si hay salida del mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
¿Es esto posible en una línea?
Consulte Verificar si la tubería está vacía y ejecute un comando en los datos si no es para un caso más general que el envío de correo electrónico.
Respuestas:
Creo que tendrá que usar un archivo temporal para esta operación para que pueda usar el
&&
operador para ejecutar solo el comando de correo si el grep devolvió un estado de salida que dice que tenía coincidencias como esta:Si no le importaba que el archivo temporal se quedara en algún lugar y puede usar un nombre estático para él, puede omitir las cosas especiales de nomenclatura y eliminación:
Editar: después de ver la respuesta de Glenn, jugué con esto un poco más y, aparentemente, asignar una variable usando la
$()
sintaxis devuelve el código de salida del comando, por lo que puede omitir la prueba que utilizó para la longitud de la cadena y usarla en su lugar. Aquí está todo en un comando:Edición 2: después de ver la respuesta de Simon, revisé mi
mail
programa. No se comporta de la manera que él describe de manera predeterminada, pero tiene una opción para eso. Desde la página del manual:Haciendo esto posible:
fuente
mktemp
no devolverán algo que necesita ser citado.glob(split(var))
. No necesita división de palabras o expansión global de archivos aquí, así que no las solicite. Además, debemos mostrar la forma correcta en este sitio .zsh
y en realidad no obtengo problemas o división de palabras en casos como este, a menos que las pida, pero por el bien de las respuestas aquí y no saber el entorno objetivo citado por principio está bien.El programa de utilidad ifne existe expresamente para este propósito: ejecutar un comando si la entrada estándar no está vacía.
El comando ifne es parte del paquete moreutils , considerado como "una colección creciente de herramientas de Unix que nadie pensó escribir hace mucho tiempo, cuando Unix era joven".
fuente
Podría guardar el resultado en una variable y luego invocar el comando de correo si la longitud de la cadena no es cero.
Para una línea, une los dos comandos con un punto y coma.
fuente
Usar
mail
con la-E
opción. En mi Mac, MAIL (1) dice que la-E
bandera no enviará correos electrónicos con un cuerpo vacío.En mi Mac, ejecuté la siguiente prueba. Tenga en cuenta que el archivo
file_does_exist
existe, pero el archivofile_does__not_exist
no existe.Esto me envía un correo electrónico:
Esto no lo hace. Tenga en cuenta que el comando
ls file_does_not_exist | egrep ...
no produce ningún resultado.fuente
En este caso particular, si
mail
admite la-E
opción , simplemente úsela. En el caso general, puede intentar leer un carácter; si hay uno, inicie el comando de postprocesamiento y alimente ese carácter del resto del archivo.Tenga en cuenta el uso útil de
cat
. La adición deecho .
hace que esta función funcione incluso si el primer carácter en la entrada es una nueva línea (recuerde que la$(…)
construcción elimina las nuevas líneas terminales).Con la mayoría de los shells (que no sea zsh, que yo sepa), si el archivo comienza con un carácter nulo, este código creerá que está vacío. Arreglo que queda como ejercicio para el lector. (Sugerencia: use
od
en la primera subshell eprintf
imprima el primer byte.) (Solución: Cómo verificar si la tubería está vacía ) Puede encontrar el mismo problema si el archivo comienza con un byte que no es un carácter válido en el actual lugar; eso es más fácil de solucionar ejecutando este código conLC_ALL=C
.fuente
read
ayuda simplificar esto?read
sh portátil (puede ser posible en bash, ksh o zsh).IIRC el
mail
comando BSD aborta si se le da un mensaje vacío.fuente
-E
opción para habilitarlo .Recientemente he aprendido sobre el nombre del comando
ifne
que forma parte delmoreutils
paquete. Donde puede usarlo para resolver este problema específico.ejemplo de la página del manual,
fuente
Puede reescribir su comando usando
test -s /dev/stdin
para verificar si hay algún resultado de lamailq | grep
parte.fuente