Vamos examinar sua ação:
:0
! 'script'
O significado dos backticks é "use a saída de script
como uma string aqui". Então, se o seu script gerar [email protected]
, a receita será efetivamente equivalente a
:0
! [email protected]
que significa encaminhar a mensagem para [email protected]
. O comportamento que você descreve não deve, portanto, ser surpreendente; Procmail está fazendo exatamente o que você está dizendo para fazer.
Se você quiser apenas descartar a mensagem completamente se o seu script retornar com sucesso, você pode tentar este truque:
:0W
| script
Isso é basicamente o mesmo que o formail -D
exemplo para suprimir duplicatas ; se o script retornar um status de saída bem-sucedida, a mensagem será considerada entregue; mas como o script não o entrega em qualquer lugar, na verdade ele está perdido. (Você obviamente precisará alterar a lógica do seu script para que o código de saída seja o inverso do que é agora.)
Caso você queira que a sintaxe seja resolvida para você, aqui está uma tentativa mais geral de fazer o que você acha que estava fazendo:
:0
? script
! somewhere
que encaminhará para somewhere
se o código de saída de script
for zero (como em sucesso); ou possivelmente
# Capture the output from script in WHERE
WHERE='script'
# Also capture its exit code
ERR=$?
# Forward to $WHERE if $ERR is zero
:0
* ERR ?? ^^0^^
! $WHERE
(Vários detalhes arcanos da sintaxe incomum do Procmail estão presentes aqui. O operando ??
examina o valor da variável nomeada; a ^^
anchor corresponde ao início / fim da string de entrada.)
Se o seu script não for mais complexo do que isso, você também pode incorporá-lo. (Observe a correção de sintaxe com um traço antes da opção i
e a inversão do status de saída com !
):
:0
* ! ? grep -i "$SENDER" /home/foo/scripts/blah/blah2.txt
! somewhere