Использование formail
(, поставляемого сprocmail
):
find ~/users/example -type f -exec sh -c '
for email do
formail -x to -x cc < "$email" |
grep -qF my@example.com &&
formail -cx subject < "$email"
done' sh {} +
То есть для каждого файла электронной почты
To
и Cc
my@example.com
там Subject
и напечатайте его в одной строке (с-c
). Это происходит потому, что ваш сценарий возвращается перед подпроцессом из >(...)
подстановки процесса, который выполняется асинхронно (, т.е. в фоновом режиме )и будет печатать свои данные только после того, как оболочка, которую вы вызвали, script из уже напечатанной подсказки.
Решение wait
для него; к сожалению, процессы, запущенные в подоболочках и т. д., не управляются как часть заданий и не отображаются в таблице заданий bash
, поэтому вам придется обойтисьpgrep -P
(find -by -parent):
func() {
in=$(cat)
sleep.2
echo "'this is it: $in'"
}
echo "a string" > >(func)
wait $(pgrep -P $$)
(Я добавил sleep.2
только для того, чтобы предотвратить ложное исчезновение симптома --дополнительного времени, которое требуется pgrep
и wait
для запуска, может быть достаточно для завершения асинхронного процесса ).
Предположение о том, что процессы, запущенные внутри > >(...)
, являются дочерними элементами основного сценария, верно только тогда, когда они используются со встроенными модулями, функциями и групповыми командами, см. здесь для получения дополнительной информации.