Подтвердить что ты не робот

Как я могу стандартизировать gzip в файле, а также стандартно печатать стандартную версию?

Я хочу выполнить команду, получить выход этой команды, получить gzip'd "на лету", а также вывести из нее команду echo/tee.

i.e, что-то вроде:

echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz

За исключением того, что строка выполняется, я хочу видеть это на стандартном выходе:

hey hey, we're the monkees
4b9b3361

Ответ 1

echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz

Как указано в комментариях, /dev/stdout может работать лучше, чем /dev/tty в некоторых случаях.

Ответ 2

Другой способ (при условии, что оболочка похожа на bash или zsh):

echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)

По общему признанию, странный синтаксис >() в основном делает следующее:

  • Создайте новый FIFO (обычно что-то в /tmp/)
  • Выполнить команду внутри () и связать FIFO с stdin в этой подкоманде
  • Верните имя файла FIFO в командную строку.

Что tee заканчивается тем, что видит, то есть что-то вроде:

tee /tmp/arjhaiX4

Все gzip видит его стандартный ввод.

Для Bash см. man bash. Это в разделе redirection. Для Zsh см. man zshexpn под заголовком "Замена процесса".

Насколько я могу судить, Korn Shell, варианты классической оболочки Bourne (включая золу и тире) и C Shell не поддерживают этот синтаксис.

Ответ 3

Сделайте приятную чашку 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|
                                    +-----+

Ответ 4

Просто отправьте способ, который не включает касание диска:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)