Альтернативный путь состоит в том, чтобы использовать a while
цикл одним из двух способов:
input_cmd|while read i; do
echo "$i";
done
или через замену процесса:
while read i; do
echo "$i";
done < <(input_cmd)
Последний является bashism насколько я знаю, таким образом, он не может работать в другой границе совместимые оболочки.
Так как Вы получаете вход от командной строки, может быть лучше придерживаться for
решение для цикла предложено в предыдущем ответе, как бы то ни было.
Необходимо также взглянуть на man xargs
, потому что это обычно - лучший способ обработать экзотические параметры командной строки.
Вообще, не нужно манипулировать почтовым каталогом напрямую. Maildir - это не только дерево каталогов с файлами, но и набор индексов и других дополнительных файлов. При создании файла в поддире ./new
необходимо, по крайней мере, воссоздать индекс соответствующей папки.
Рекомендуется использовать утилиту doveadm
для создания папок в подпапках, а также для их подписки. Если вы хотите ввести какое-либо сообщение для служанки, необходимо использовать утилиту deliver
, которая выполняет инъекцию в соответствующем пути.
Для чтения содержимого maildir необходимо использовать библиотеку IMAP, соответствующую протоколу IMAP. Я не знаком с Java, но абсолютно уверен, что существует несколько библиотек с требуемой функциональностью.
Необработанный доступ к почтовому каталогу не рекомендуется.
http://wiki2.dovecot.org/Tools/Doveadm
-121--230211- Можно eval
использовать команду:
eval "ls $pipedargument"
или даже лучше определить функцию, например:
sorted() { "$@" | sort -n; }
и позднее при вызове с нужными аргументами:
sorted ls /tmp
-121--48419- Вы правы, что не можете использовать |
этот путь. Причина в том, что оболочка уже искала трубопроводы и разделяла их на команды, прежде чем выполнить подстановку переменных. Следовательно, |
рассматривается как просто другой символ.
Одним из возможных обходов является размещение символа трубы буквально:
$ cmd="sort -n"
$ ls | $cmd
В случае, если конвейер не нужен, можно использовать cat
в качестве «nop» или местозаполнителя:
$ cmd=cat
$ ls | $cmd
Этот метод позволяет избежать тонкостей оценки . См. также здесь .
Более сложный подход будет использовать массивы bash
вместо простых последовательностей:
$ cmd=(sort -n)
$ ls | "${cmd[@]}"
Преимущество массивов становится важным, как только вам нужна команда cmd
, чтобы содержать цитируемые аргументы.
Я бы использовал функцию для этого. Что-то вроде:
### usage pipedargument cmd args ###
pipedargument()
{
sort -n <<< "$( "$@" )"
}
$ pipedargument /sbin/ifconfig eth0
RX bytes:5904986765 (5.4 GiB) TX bytes:714370767 (681.2 MiB)
RX packets:5981427 errors:0 dropped:0 overruns:0 frame:0
TX packets:4403989 errors:0 dropped:0 overruns:0 carrier:0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
collisions:0 txqueuelen:1000
inet addr:XXX.XXX.X.XX Bcast:XXX.XXX.X.XXX Mask:255.255.255.0
inet6 addr: xx00::0x0x:00xx:xx0:000/00 Scope:Link
eth0 Link encap:Ethernet HWaddr 0x:0x:00:x0:00:00
Вы можете eval
uate команду:
eval "ls $pipedargument"
или даже лучше определить функцию типа:
sorted() { "$@" | sort -n; }
и позже вызвать ее с нужными аргументами:
sorted ls /tmp