Абсолютно буферный вывод команды прежде, чем передать по каналу к другой команде?

Это не "scp с регулярными выражениями", тот, обрабатывающий шарики файла, является оболочкой. scp просто вручен уже расширенный список файлов. И расширение происходит на машине, куда команда выполняется.

Извините, не может (легко) сделать.

9
19.03.2018, 21:48
4 ответа

Это похоже на пару других ответов. Если у вас есть пакет «TORETILS», у вас должна быть команда SPONGE . Попробуйте

commandA | sponge | { IFS= read -r x; { printf "%s\n" "$x"; cat; } | commandB; }

Команда команда в основном является пропускной фильтр (вроде CAT )) За исключением того, что он не начинает писать вывод, пока он не прочитал весь ввод. I.e., это «впитывает» данные, а затем выпускают его, когда вы сжимаете его (как губка). Итак, в определенной степени это «обмана» - Если есть нетривиальное количество данных, губка [113040] почти наверняка использует временный файл. Но вам невидим; Вам не нужно беспокоиться о домашних хозяйствах Как выбирать уникальное имя файла и уборка после этого.

{IFS = READ -R X; {printf "% s \ n" "$ x"; кошка; } |. CommandB; } Читает первую строку вывода из губки . Помните, что это не отображается до Commanda . Затем он загорелся CommandB , пишет первую строку в трубу, и вызывает CAT , чтобы прочитать оставшуюся часть вывода и записывать его в трубу.

13
27.01.2020, 20:05

Я не знаю ни одной стандартной утилиты UNIX, которая может решить эту проблему. Один вариант будет использовать awk , чтобы накапливать Commanda Commanda Вывод и промойте его в CommandB на одном выстрелке, как и поэтому

commandA  | awk '{x = x ORS $0}; END{printf "%s", x | "commandB"}'

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

1
27.01.2020, 20:05

Команды в трубопроводе запускаются одновременно, необходимо где-то хранить вывод командыA для последующего использования. Вы можете избежать использования временного файла, используя переменную:

output=$(command A; echo A)
printf '%s' "${output%%A}" | commandB
4
27.01.2020, 20:05

Вы можете решить требование с небольшим сценарием. Этот конкретный вариант позволяет избежать временного файла и потенциальной памяти за счет дополнительных процессов.

#!/bin/bash
#
IFS= read LINE

if test -n "$LINE"
then
    test -t 2 && echo "Starting $*" >&2
    (
        echo "$LINE"
        cat

    ) | "$@"
else
    exit 0
fi

Если бы вы позвонили скрипту WINITUNTIL (и сделайте его исполняемым, поместите его в путь , и т. Д.), Вы бы использовали его, как этот пример

commandA... | waituntil commandB...

( sleep 3 ; date ; id ) | waituntil nl
0
27.01.2020, 20:05

Теги

Похожие вопросы