¿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
mailprograma. 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
mktempno 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 .zshy 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
mailcon la-Eopción. En mi Mac, MAIL (1) dice que la-Ebandera 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_existexiste, pero el archivofile_does__not_existno 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
mailadmite la-Eopció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
oden la primera subshell eprintfimprima 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
readayuda simplificar esto?readsh portátil (puede ser posible en bash, ksh o zsh).IIRC el
mailcomando BSD aborta si se le da un mensaje vacío.fuente
-Eopción para habilitarlo .Recientemente he aprendido sobre el nombre del comando
ifneque forma parte delmoreutilspaquete. 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/stdinpara verificar si hay algún resultado de lamailq | grepparte.fuente