Linux / Debian - Что делает 'pee' в moreutils?

21

Недавно я обнаружил пакет 'moreutils' в Debian (и Ubuntu) . Это коллекция удобных инструментов Unix.

Одна из команд - «Пи». Страница руководства говорит:

моча, как чай, но для труб.

Однако это короткая справочная страница, я подал ошибку об этом . Кто-нибудь знает, что он делает, как его использовать, зачем его использовать?

Рори
источник

Ответы:

29

Вот что вы можете сделать с мочой:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

Так что Пи работает с трубами оболочки вместо файлов.

bash не нуждается в pee, он может открывать команды оболочки в виде файлов:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)
Tobu
источник
1
Будет ли это работать с именами джокеров? См. Zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - pee используется для умножения stdinи приведения клонов к каждому сценарию, объединяющему шаблон имени файла, может ли это сделать чистый bash? AFAIU это расширило бы звездочку внутри скобок, что-то вроде tee >(app1 app2 app3 app4)этого не >(app1) >(app2) >(app3) >(app4)то, что показывает ваш ответ
Arioch '
@Arioch, синтаксис bash не будет работать с техникой ловушек. Просто установите moreutils.
Тобу
1
Используйте, tee >/dev/nullчтобы избежать репликации stdin в stdout
jfs
1
реальное преимущество мочи над tee состоит в том, что он посылает стандартный вывод от каждого подпроцесса на стандартный вывод самого мочи. с помощью tee вам нужно перенаправить стандартный процесс каждого процесса в файл, если вы хотите сохранить его, но с помощью pee вам просто нужно сохранить стандартный вывод. конечно, это имеет смысл, только если каждая подкоманда выводит одинаково отформатированный объект. например, если вы не можете понять, как или с помощью регулярных выражений в grep вы можете сделать cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... используя tee, вы просто получите копию fileна stdout.
опустошил
Эта >(command)функция называется процессом замены .
Властимил Овчачик
16

Это, вероятно, легче понять, если вы использовали в teeпервую очередь. Этот полезный старый инструмент принимает стандартный ввод и записывает в несколько файлов, плюс стандартный вывод. Последующий:

echo "Hello world" | tee one two

Создаст два файла с именем oneи two, оба, содержащие строку Hello world. Он также будет распечатан на ваш терминал.


Теперь peeвыполняет аналогичную функцию, но вместо перенаправления вывода на несколько файлов он перенаправляет на несколько вторичных команд, а именно конвейеры. Он немного отличается от teeтого, что он не отправляет исходный stdin на stdout, потому что не имеет смысла объединять его с выводом вторичных команд. Следующий очень простой пример:

echo "Hello world" | pee cat cat

Выводит строку Hello worldна ваш терминал дважды. Это потому, что каждый из двух экземпляров catполучает стандартный вывод и выполняет то cat, что делает, то есть печать.

Дэн Карли
источник