Когда вы запускаете echo
, вы отправляете вывод на терминал. Терминал интерпретирует escape-последовательности, например, для изменения цвета в отправляемом ему выводе. Эти escape-последовательности предназначены для отправки приложениями, поэтому они распознаются в выводе, который поступает из приложения, работающего в терминале. Обычно приложение, работающее в терминале, запускается эмулятором терминала (вашей оболочкой )и теми, которые запускаются им по очереди, но если вы запустите echo … >/dev/tty2
, то echo
фактически «работает в терминале». ” (в том смысле, что его вывод идет на терминал, что здесь имеет значение ).
Когда вы нажимаете Esc [ и т. д., вы отправляете ввод на терминал. Терминал не интерпретирует escape-последовательности, например, для изменения цвета на входе, который он получает. Терминал интерпретирует escape-последовательности при вводе, но для совершенно другой цели :они представляют собой способ кодирования нажатий функциональных клавиш.
Как работает ввод с клавиатуры и вывод текста? имеет соответствующую предысторию.
ОБНОВЛЕНИЕ:
Вы должны иметь возможность сделать что-то подобное с оболочкой Bash:
zfs send [snip] | tee >(md5sum > checksum.log) | ssh [snip]
См. раздел Process Substitution
в man bash
. (Спасибо Оле Танге за указание на это упрощение.)
Оригинальный ответ:
Есть несколько способов сделать то, что вы хотите.
Вы можете написать скрипт (или программу на Python или на другом языке по вашему выбору ), который будет читать из stdin
и одновременно (a )вычислять контрольную сумму и (b )передача данных в подпроцесс (, например, в ssh
).
Кроме того, вы могли бы сделать что-нибудь в Bash, например:
zfs send [snip] | tee /proc/self/fd/4 4>(md5sum > checksum.log) | ssh [snip]
Я не проверял описанное выше, поэтому не могу гарантировать, что оно будет работать. Если в вашей системе нет /proc/self/fd/N
, вам может понадобиться найти (или написать )какую-нибудь программу, отличную от tee
. См. man tee
и раздел REDIRECTION
в man bash
, в частности, подраздел Redirecting Output
.