Ответ 1
echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz
Как указано в комментариях, /dev/stdout
может работать лучше, чем /dev/tty
в некоторых случаях.
Я хочу выполнить команду, получить выход этой команды, получить gzip'd "на лету", а также вывести из нее команду echo/tee.
i.e, что-то вроде:
echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz
За исключением того, что строка выполняется, я хочу видеть это на стандартном выходе:
hey hey, we're the monkees
echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz
Как указано в комментариях, /dev/stdout
может работать лучше, чем /dev/tty
в некоторых случаях.
Другой способ (при условии, что оболочка похожа на bash
или zsh
):
echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)
По общему признанию, странный синтаксис >()
в основном делает следующее:
/tmp/
)()
и связать FIFO с stdin в этой подкомандеЧто tee
заканчивается тем, что видит, то есть что-то вроде:
tee /tmp/arjhaiX4
Все gzip
видит его стандартный ввод.
Для Bash см. man bash
. Это в разделе redirection. Для Zsh см. man zshexpn
под заголовком "Замена процесса".
Насколько я могу судить, Korn Shell, варианты классической оболочки Bourne (включая золу и тире) и C Shell не поддерживают этот синтаксис.
Сделайте приятную чашку tee!
Команда tee копирует стандартный ввод к стандартному выпуску, а также к любому файлы, указанные в качестве аргументов. Это полезно, когда вы хотите не только отправить некоторые данные по трубе, но и к сохранить копию
Поскольку у меня есть медленный день, здесь несколько славных иллюстраций ascii-art...
+-----+ +---+ +-----+
stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2|
+-----+ +---+ +-----+
|
v
file
Как показывает greyfade в другом ответе, "файл" не обязательно должен быть обычным файлом, но может быть FIFO, позволяющим вам вывести этот тэв в третью команду.
+-----+ +---+ +-----+
stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2|
+-----+ +---+ +-----+
|
v
FIFO
|
v
+-----+
|cmd 3|
+-----+
Просто отправьте способ, который не включает касание диска:
echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)