Скопируйте стандартный ввод в стандартный вывод Bash - PullRequest
0 голосов
/ 26 апреля 2020

Я ищу решение pure Bash для копирования данных из стандартного ввода функции в стандартный вывод без обработки.

Цель состоит в том, чтобы украсить ввод путем вывода некоторого текста до и после него.

Самое чистое решение - использовать двоичные файлы cat или tee. Но, как и требовалось, решение должно быть в чистом виде Bash.

Мое текущее решение

На данный момент мое решение заключается в использовании встроенного read:

decorate() {
    local line

    printf '%s' "<"

    while IFS= read -r line; do
        printf '%s\n' "$line"
    done

    if ((${#line} > 0)); then
        printf '%s' "$line"
    fi

    printf '%s' ">"
}
$ printf '%s\n' "foo" "bar" "baz" | decorate
<foo
bar
baz
>

Минусы

  • Данные читаются построчно,
  • данные присваиваются переменной,
  • последняя строка (если не заканчиваются переводом строки), особенно нужно обрабатывать.

Это решение может быть приемлемым, если мне нужно обработать ввод. Но это кажется излишним, потому что мне просто нужно передать данные стандартного ввода в стандартный вывод.

Текущий вывод (из jpmam1)

Я пытался использовать перенаправление:

decorate() {
    printf '%s' "<" "$(</dev/stdin)" ">"
}

Плюсы

  • Код более краткий,
  • все читается за один раз.

Минусы

  • Когда данные из стандартного ввода заканчивается новой строкой, она не сохраняется:
$ printf '%s\n' "foo" "bar" "baz" | decorate
<foo
bar
baz>
$ echo $'\n\n\n\n' | decorate
<>
...