Используя | символ вертикальной черты от $variable заставляет его рассматривать как просто другой аргумент в ударе; как выйти из него?

Альтернативный путь состоит в том, чтобы использовать a while цикл одним из двух способов:

input_cmd|while read i; do
  echo "$i";
done

или через замену процесса:

while read i; do
  echo "$i";
done < <(input_cmd)

Последний является bashism насколько я знаю, таким образом, он не может работать в другой границе совместимые оболочки.

Так как Вы получаете вход от командной строки, может быть лучше придерживаться for решение для цикла предложено в предыдущем ответе, как бы то ни было.

Необходимо также взглянуть на man xargs, потому что это обычно - лучший способ обработать экзотические параметры командной строки.

8
01.01.2015, 23:55
3 ответа

Вообще, не нужно манипулировать почтовым каталогом напрямую. Maildir - это не только дерево каталогов с файлами, но и набор индексов и других дополнительных файлов. При создании файла в поддире ./new необходимо, по крайней мере, воссоздать индекс соответствующей папки.

Рекомендуется использовать утилиту doveadm для создания папок в подпапках, а также для их подписки. Если вы хотите ввести какое-либо сообщение для служанки, необходимо использовать утилиту deliver , которая выполняет инъекцию в соответствующем пути.

Для чтения содержимого maildir необходимо использовать библиотеку IMAP, соответствующую протоколу IMAP. Я не знаком с Java, но абсолютно уверен, что существует несколько библиотек с требуемой функциональностью.

Необработанный доступ к почтовому каталогу не рекомендуется.

http://wiki2.dovecot.org/Tools/Doveadm

http://wiki2.dovecot.org/LDA

-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 , чтобы содержать цитируемые аргументы.

9
27.01.2020, 20:10

Я бы использовал функцию для этого. Что-то вроде:

### 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
0
27.01.2020, 20:10

Вы можете evaluate команду:

eval "ls $pipedargument"

или даже лучше определить функцию типа:

sorted() { "$@" | sort -n; }

и позже вызвать ее с нужными аргументами:

sorted ls /tmp
5
27.01.2020, 20:10

Теги

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