Объясните мне, как работает это волшебство трубы Shell (… | tee> (tail -c1> $ PULSE) | bzip2 |…)?

0

Здесь исходный исходный код (соответствующий 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 никогда не прерывается с ошибкой.

  • 2
    Ошибка 32 соответствует сломанной трубе. Похоже, что bzip2 завершил работу, закрыв один конец канала для чтения, но mysqldump продолжал записывать данные в канал
Теги:
io-redirection
pipe

1 ответ

1
Лучший ответ

Трудная часть состоит в том, что:

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню