Linux, и я воображаю OSX также, идет с универсальным драйвером USB, который позволяет приложениям говорить непосредственно на уровне USB. Это - довольно простая функция; то, что удивительно мне, скорее, как Windows иногда требует определенного для телефона драйвера для adb.
Можно использовать tee
и замена процесса >(...)
для этого:
zcat my_data_file.gz |
# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |
# Further processing
process_data.py
Обратите внимание, что каналы могут использоваться для продолжения строки и что комментарии могут быть вкраплены между командами, хорошая функция, когда здание усложнило конвейеры.
Это не совсем эффективно, но можно достигнуть этого с именованными каналами, с которыми можно создать mkififo(1)
Для примера в вопросе:
mkfifo /tmp/f
wc -l /tmp/f > /tmp/linecount &
zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py &
wait
rm /tmp/f
Отметьте &
добавленный обоим wc
и конвейер; это означает, что оболочка продвинет к задачам к фону. Вызов к wait
затем ожидает всех фоновых задач для завершения. Оба процесса закончатся примерно в то же время.
Остерегайтесь этого, если один из Ваших процессов существенно медленнее, он мог бы значительно замедлить все это, как tee
может заблокироваться или на его канале stdout или на именованном канале, в который он пишет.Править: Кроме того, это теперь получило больше видов отказа, поскольку мишень выйдет из-за поврежденного канала, если Ваш вторичный процесс перестанет работать.
wc
это печатает его результат к stderr и гарантирует, что каждый байт от stdin выходит из своего stdout. Остерегайтесь, тем не менее, что архитектурно более 'эффективная' реализация может быть медленнее так или иначе как coreutils, и sed/awk в большой степени оптимизированы для многих задач.
– Cera
14.04.2013, 08:54