Comment puis-je réécrire cette commande dans un e-mail uniquement s'il y a une sortie du mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Est-ce même possible sur une seule ligne?
Voir Vérifier si le canal est vide et exécuter une commande sur les données si ce n'est pas pour un cas plus général que d'envoyer un e-mail.
Réponses:
Je pense que vous devrez utiliser un fichier temporaire pour cette opération afin que vous puissiez utiliser l'
&&
opérateur pour exécuter la commande mail uniquement si le grep a renvoyé un état de sortie qui indique qu'il avait des correspondances comme ceci:Si cela ne vous dérange pas que le fichier temporaire reste quelque part et puisse utiliser un nom statique, vous pouvez ignorer les éléments spéciaux de dénomination et de suppression:
Edit: Après avoir vu la réponse de glenn, j'ai encore joué avec cela et apparemment, assigner une variable en utilisant la
$()
syntaxe renvoie le code de sortie de la commande, vous pouvez donc ignorer le test qu'il a utilisé pour la longueur de la chaîne et l'utiliser à la place. Ici, tout est dans une seule commande:Edit 2: Après avoir vu la réponse de Simon, j'ai vérifié mon
mail
programme. Il ne se comporte pas de la manière qu'il décrit par défaut, mais a une option pour cela. Depuis la page de manuel:Rendre cela possible:
la source
mktemp
ne retourneront pas quelque chose qui doit être cité.glob(split(var))
. Vous n'avez pas besoin de fractionnement de mots ou d'extension de glob de fichiers ici, alors ne les demandez pas. De plus, nous devons montrer la bonne voie sur ce site .zsh
et je n'obtiens pas de globulation ou de fractionnement de mots dans des cas comme celui-ci, sauf si je les demande, mais pour le bien des réponses ici et ne pas connaître l'environnement cible citant par principe, c'est bien.Le programme utilitaire ifne existe expressément à cet effet: pour exécuter une commande si l'entrée standard n'est pas vide.
La commande ifne fait partie du paquet moreutils , présenté comme "une collection croissante d'outils Unix que personne ne pensait écrire il y a longtemps, quand Unix était jeune".
la source
Vous pouvez enregistrer la sortie dans une variable, puis appeler la commande mail si la longueur de la chaîne n'est pas nulle.
Pour une ligne, joignez les deux commandes avec un point-virgule.
la source
À utiliser
mail
avec l'-E
option. Sur mon Mac, MAIL (1) indique que le-E
drapeau n'enverra pas d'e-mail avec un corps vide.Sur mon Mac, j'ai exécuté le test suivant. Notez que le fichier
file_does_exist
existe, mais le fichierfile_does__not_exist
n'existe pas.Cela m'envoie un e-mail:
Ce n'est pas le cas. Notez que la commande
ls file_does_not_exist | egrep ...
ne produit aucune sortie.la source
Dans ce cas particulier, si votre
mail
prend en charge l'-E
option , utilisez-la simplement. Dans le cas général, vous pouvez essayer de lire un caractère; s'il y en a un, lancez la commande de post-traitement et donnez-lui ce caractère à partir du reste du fichier.Notez l'utilisation utile de
cat
. L'ajout deecho .
fait que cette fonction fonctionne même si le premier caractère dans l'entrée est une nouvelle ligne (rappelez-vous que la$(…)
construction supprime les nouvelles lignes de terminal).Avec la plupart des shells (autre chose que zsh, pour autant que je sache), si le fichier commence par un caractère nul, ce code pensera qu'il est vide. Correction qui est laissée comme un exercice pour le lecteur. (Astuce: utilisez
od
dans le premier sous-shell etprintf
pour imprimer le premier octet.) (Solution: comment vérifier si le canal est vide ) Vous pouvez rencontrer le même problème si le fichier commence par un octet qui n'est pas un caractère valide dans le courant lieu; c'est plus facile à corriger en exécutant ce code avecLC_ALL=C
.la source
read
aide pourrait-elle simplifier cela?read
in portable sh (cela peut être possible en bash, ksh ou zsh).IIRC la
mail
commande BSD s'interrompt si un message vide est donné.la source
-E
option pour l'activer .Récemment, j'ai appris le nom de la commande
ifne
qui fait partie dumoreutils
package. Où vous pouvez l'utiliser pour résoudre ce problème spécifique.exemple de la page de manuel,
la source
Vous pouvez réécrire votre commande en utilisant
test -s /dev/stdin
pour vérifier s'il y a une sortie de lamailq | grep
pièce.la source