Это не "scp с регулярными выражениями", тот, обрабатывающий шарики файла, является оболочкой. scp
просто вручен уже расширенный список файлов. И расширение происходит на машине, куда команда выполняется.
Извините, не может (легко) сделать.
Это похоже на пару других ответов.
Если у вас есть пакет «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
, чтобы прочитать оставшуюся часть вывода и записывать его в трубу.
Я не знаю ни одной стандартной утилиты UNIX, которая может решить эту проблему. Один вариант будет использовать awk
, чтобы накапливать Commanda Commanda
Вывод и промойте его в CommandB
на одном выстрелке, как и поэтому
commandA | awk '{x = x ORS $0}; END{printf "%s", x | "commandB"}'
Остерегайтесь, что это может быть в памяти, поскольку awk
создает строку с его ввода.
Команды в трубопроводе запускаются одновременно, необходимо где-то хранить вывод командыA
для последующего использования. Вы можете избежать использования временного файла, используя переменную:
output=$(command A; echo A)
printf '%s' "${output%%A}" | commandB
Вы можете решить требование с небольшим сценарием. Этот конкретный вариант позволяет избежать временного файла и потенциальной памяти за счет дополнительных процессов.
#!/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