Como posso reescrever esse comando para enviar apenas emails se houver saída do mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Isso é possível em uma linha?
Consulte Verifique se o canal está vazio e execute um comando nos dados, se não for para um caso mais geral do que o envio de email.
Respostas:
Eu acho que você terá que usar um arquivo temporário para esta operação, para que você possa usar o
&&
operador para executar apenas o comando mail se o grep retornou um status de saída que diz ter correspondências como esta:Se você não se importou com o arquivo temporário em algum lugar e pode usar um nome estático para ele, pule as coisas especiais de nomeação e exclusão:
Edit: Depois de ver a resposta de Glenn, eu brinquei mais com isso e, aparentemente, atribuir uma variável usando a
$()
sintaxe retorna o código de saída do comando, para que você possa pular o teste que ele usou para o comprimento da string e usá-lo. Aqui está tudo em um comando:Edit 2: Depois de ver a resposta de Simon, verifiquei meu
mail
programa. Ele não se comporta da maneira que ele descreve por padrão, mas tem uma opção para isso. Na página do manual:Tornando isso possível:
fonte
mktemp
não retornam algo que precisa ser citado.glob(split(var))
. Você não precisa dividir palavras ou expandir arquivos aqui, portanto, não as peça. Além disso, precisamos mostrar o caminho certo neste site .zsh
e na verdade não estou obtendo globbing ou divisão de palavras em casos como este, a menos que eu peça por elas, mas por uma questão de respostas aqui e por não conhecer o ambiente de destino citando por princípio, está bem.O programa utilitário ifne existe expressamente para esse fim: executar um comando se a entrada padrão não estiver vazia.
O comando ifne faz parte do pacote moreutils , anunciado como "uma coleção crescente de ferramentas Unix que ninguém pensou em escrever há muito tempo, quando o Unix era jovem".
fonte
Você pode salvar a saída em uma variável e, em seguida, chamar o comando mail se o comprimento da sequência for diferente de zero.
Para uma linha, junte os dois comandos com um ponto e vírgula.
fonte
Use
mail
com a-E
opção No meu Mac, MAIL (1) diz que o-E
sinalizador não enviará email com o corpo vazio.No meu Mac, executei o seguinte teste. Observe que o arquivo
file_does_exist
existe, masfile_does__not_exist
ele não existe.Isso envia um e-mail para mim:
Isso não acontece. Observe que o comando
ls file_does_not_exist | egrep ...
não produz nenhuma saída.fonte
Nesse caso em particular, se o seu
mail
suportar a-E
opção , use-a. No caso geral, você pode tentar ler um caractere; se houver, inicie o comando de pós-processamento e alimente esse caractere a partir do restante do arquivo.Observe o uso útil de
cat
. A adição deecho .
faz com que essa função funcione mesmo que o primeiro caractere na entrada seja uma nova linha (lembre-se de que a$(…)
construção retira as novas linhas do terminal).Com a maioria dos shells (qualquer coisa que não seja zsh, tanto quanto eu sei), se o arquivo começar com um caractere nulo, esse código acreditará que está vazio. Correção deixada como um exercício para o leitor. (Dica: use
od
no primeiro subshell eprintf
imprima o primeiro byte.) (Solução: Como verificar se o pipe está vazio ) Você pode encontrar o mesmo problema se o arquivo começar com um byte que não é um caractere válido no atual localidade; é mais fácil de corrigir executando esse código comLC_ALL=C
.fonte
read
ajuda poderia simplificar isso?read
no sh portátil (pode ser possível no bash, ksh ou zsh).IIRC o
mail
comando BSD é interrompido se receber uma mensagem vazia.fonte
-E
opção para habilitá-lo .Recentemente eu aprendi sobre o nome do comando
ifne
que faz parte domoreutils
pacote. Onde você pode usá-lo para resolver esse problema específico.exemplo da página de manual,
fonte
Você pode reescrever seu comando usando
test -s /dev/stdin
para verificar se há alguma saída damailq | grep
peça.fonte