найдите: Почему-a оператор не является коммутативным в сочетании с - печать?

Традиционный mailx не поддерживает IMAP или POP, но тот, который идет с Linux, делает.

Для Вашей конкретной проблемы я рекомендую использовать fetchmail вместо этого. Можно использовать --mda опция иметь fetchmail выполните сценарий по Вашему выбору для каждого загруженного сообщения. Это может даже передать От и До адресов как параметры к Вашему сценарию, если Вы используете %F и %T как заполнители в командной строке.

Во-первых, создайте a mailsorter сценарий:

#!/bin/sh

dest_mbox="$1"
from="$2"
to="$3"

case "$from-$to" in
  someone@example.net-myname)
     echo "From $from  `date`" >> "$dest_mbox"
     cat >> "$dest_mbox"
     ;;
  *)
     cat > /dev/null
     ;;
esac

Затем выполненный fetchmail -u myname popserver.example.com --mda './mailsorter /tmp/mbox %F %T'

При тестировании этого решения дать fetchmail --all и --keep флаги, чтобы удостовериться, что Вы не удаляете свою почту случайно.

3
31.08.2014, 15:49
3 ответа

Использовать функцию оболочки вместо псевдонима:

function my_find
{
   exclude_dir="$1"
   shift
   find . \( -type d -name "$exclude_dir" -prune \) -o \( -type f -a -iname "$@" -a -print \)
}
2
27.01.2020, 21:09

и и или не являются коммутативными во многих языках программирования, например, C, C++, C♯, оболочках, find и многих других.

Они используют ленивые оценки слева направо, т.е. сначала вычисляют термин слева, а затем, при необходимости, только справа. Поэтому в false и b, b не вычисляется, так как ответ всегда ложный. Но в b и false вычисляется b, так как еще не было видно, что второй член ложен.

Это не имеет значения, когда члены являются чистыми функциями, т.е. предикатом (что-то, что возвращает булев и ничего больше не делает), но когда он что-то делает (имеет побочные эффекты), то это имеет значение.

-печать что-то делает. Она печатает, поэтому это имеет значение.

Обратите внимание, любая система, которая допускает побочные эффекты (такие как -печать), должна определять порядок оценки, и слева направо, вероятно, самая простая.

6
27.01.2020, 21:09

Они не то же. - печать основной всегда оценивается как верная и заставляет текущий путь быть записанным в стандартный вывод.

, Когда вы используете:

\( -type f -a -print -a -iname '*.mp3' \)

Все найденные файлы будут распечатаны к stdout, это поведение по умолчанию - печать , независимо от -iname '*.mp3' , выражение является TRUE или FALSE.

, Когда вы используете:

\( -type f -a -iname '*.mp3' -a -print \)

- печать часть, только достигнутая, если -iname '*.mp3' выражение верно. Таким образом, только файлы, которые заканчиваются .mp3, будут распечатаны.

POSIX определяет , находят-a оператор как:

выражение [-a] Соединение выражения

основных устройств; операция И подразумевается сопоставление двух основных устройств или сделанный явным дополнительным-a оператор. второе выражение не должно быть оценено если первое выражение является ложью.

В этом случае, вы не должны использовать - печать , потому что, если выражение верно, - печать добавляется по умолчанию:

, Если никакое выражение не присутствует, - печать должна использоваться в качестве выражения. Иначе, если данное выражение не содержит ни одного из основные устройства - должностное лицо, - хорошо, или - печать, данное выражение должно быть эффективно замененный:

(given_expression) - печать

, Но это вызовет , exclude_me печатается в выводе, потому что то, когда находят , соответствовало ему, - чернослив выражение причин, оцененное к истинному. И с тех пор, когда мы опустили - печать в 2-м выражении, - печать добавляется в конец обоих выражений. Это похоже:

find . \( -type d -name 'exclude_me' -prune \) -print -o \( -type f -a -iname '*.mp3' \) -print

Это вызывает , exclude_me печатается.

можно всегда опускать exclude_me в выводе путем явного добавления - печать в 2-м выражении. Это вызывает - печать только запросила 2-е выражение:

find . \( -type d -name 'exclude_me' -prune \) -o \( -type f -a -iname '*.mp3' \) -print

Или добавление выражения после - чернослив , и удостоверяется, что это делает 1-ю ложь выражения:

find . \( -type d -name 'exclude_me' -prune -a -name . \) -o \( -type f -a -iname '*.mp3' \)
3
27.01.2020, 21:09

Теги

Похожие вопросы