Объясните мне, как работает это волшебство трубы Shell (... | tee> (tail -c1> $ PULSE) | bzip2 | ...)? - PullRequest
0 голосов
/ 25 апреля 2018

Здесь оригинальный исходный код (соответствующие 30 строк bash код выделен)

Здесь упрощено (s3 - это двоичный файл, который передается в хранилище объектов). Точки (...) - это параметры, которые не публикуются здесь.

PULSE=$(mktemp -t shield-pipe.XXXXX)
trap "rm -f ${PULSE}" QUIT TERM INT

set -o pipefail
mysqldump ... | tee >(tail -c1 >$PULSE) | bzip2 | s3 stream ...

Как это работает? Можете ли вы объяснить мне, как это перенаправления и трубы работают? Как отладить ошибку mysqldump: Got errno 32 on write. При ручном вызове (только) mysqldump никогда не завершается с ошибкой.

1 Ответ

0 голосов
/ 25 апреля 2018

Хитрая часть в том, что:

  • tee пишет в стандартный вывод, а также в файл
  • >( cmd ) создает замену процесса, доступную для записи (команда, которая имитирует поведение файла, доступного для записи)

Используется для эффективной передачи вывода mysqldump в две другие команды: tail -c1 для печати последнего байта в файл и bzip2 для сжатия потока.

Как указал Иниан в комментариях, ошибка 32 происходит из-за сломанной трубы. Я предполагаю, что это происходит из-за прекращения s3 stream (может быть тайм-аут?), Что, в свою очередь, приводит к сбою предыдущих команд в конвейере.

...