`tee` для команд

15

teeможет перенаправить стандартный ввод данных в стандартный вывод и файл.

echo Hello, World! | tee greeting.txt

Приведенная выше команда отобразит приветствие на экране терминала и сохранит его в содержимом greeting.txtфайла, создав файл, если его нет с таким именем.

Также есть -aпереключатель для teeдобавления в существующий файл вместо перезаписи.


Есть ли удобный способ перенаправить ввод по каналу в команду и стандартный вывод вместо файла?

Я пытаюсь создать скрипт-обертку, bukuчтобы скопировать в основной выбор URL-адрес закладки, указанный ее индексным номером.

# bukuc:
#!/bin/sh
url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL
echo $url # DISPLAY
echo $url | xsel # PRIMARY SELECTION

Здесь я использую echo два раза, сначала для отображения на терминале, а затем для сохранения в основной выбор (буфер обмена).

Я представляю что-то echo $url | teeC xselили ярлык для отображения вывода перед передачей следующей команде (связывание команд), что позволило бы мне объединить всю команду в одну строку без необходимости сохранять результат в переменной следующим образом:

buku -f 1 -p $1 | cut -f 2 | teeC xsel    

Я также могу использовать его urlviewдля просмотра, выбора и открытия с помощью $BROWSERследующего:

bukuc 10-20 | urlview

источник
3
Попробуйте tee /dev/ttyили tty0(точно не помню ... я в пути)
Георгий Василиу
2
info teeупоминает о замене процесса и выводе тройника в программу ...
Xen2050

Ответы:

19

Это просто в оболочках, которые поддерживают замену процессов , например, bash

$ echo foo | tee >(xsel)
foo
$ xsel -o
foo

В противном случае, вы могли бы использовать FIFO (хотя ему не хватает удобства)

$ mkfifo _myfifo
$ xsel < _myfifo &
$ echo bar | tee _myfifo
bar
$ xsel -o
bar
[1] + Done                       xsel 0<_myfifo
$ 
steeldriver
источник
Благодарность! Я заметил две вещи: 1. sh(оболочка Bourne) не поддерживает эту функцию; 2. Стрелка должна вставлять как часть единого оператора >()для подстановки процесса.
11

Прямым аналогом «тройника для команд» является peeкоманда из moreutils ( teeно с конвейерами ). Его аргументы используются как команды для запуска, а не как пути, и они получают входные данные, а не записывают их в файл. Все команды получают стандартный ввод, который вы передали peeкак свои собственные.

Используя pee, вы можете получить результат , который вы хотели, рассказав ему работать как xselи catс входом.

echo foo | pee xsel cat

Там есть дополнительный catпроцесс для вывода, который на самом деле не является проблемой для вашего случая использования, но может быть менее идеальным в других случаях. Это работает с любой оболочкой, в отличие от подстановки процессов, но, конечно, для этого требуется дополнительный (возможно, менее распространенный) инструмент.

Вы можете дать более сложные команды, цитируя их: pee "xsel --display :1" cat. Они работают с sh, так что вы должны быть осторожны с метасимволами оболочки.

Майкл Гомер
источник
4
Очень круто - не знал об этом
Steeldriver
2
Это ... не хорошее имя.
Дэвид Ричерби