Обычная команда tar
tar cvf foo.tar ./foo >foo.out 2>foo.err
имеет три выходных потока ввода-вывода
- архивировать данные на foo.tar
- список имен файлов для STDOUT (перенаправляется в foo.out)
- сообщения об ошибках в STDERR (перенаправлены в foo.err)
Затем я могу проверить foo.err на наличие сообщений об ошибках, не просматривая список имен файлов.
если я хочу что-то сделать с архивными данными (передать через netcat или специальную программу сжатия), я могу использовать -f -
опцию tar таким образом
tar cvf - ./foo 2>foo.err | squish > foo.tar.S
Но теперь мой список имен файлов смешан с моими сообщениями об ошибках, потому что -v
вывод tar, очевидно, не может идти в STDOUT (туда, куда поступают архивные данные), поэтому tar ловко записывает это вместо этого в STDERR.
Используя оболочку Korn, есть способ создать команду, которая передает поток архива в другую команду, но при этом сохраняет -v
выходные данные отдельно от любых сообщений об ошибках.
tee
? Это похоже на вполне допустимый вариант использования.Ответы:
Если ваша система поддерживает
/dev/fd/n
:Который с AT & T реализациями
ksh
(илиbash
илиzsh
) вы могли бы написать, используя подстановку процесса :Это происходит точно так же, за исключением того, что на этот раз оболочка решает, какой дескриптор файла использовать вместо
3
(обычно выше 9). Другое отличие состоит в том, что на этот раз вы получаете статус выходаtar
вместоsquish
. В системах, которые не поддерживают/dev/fd/n
, некоторые оболочки могут использовать именованные каналы для этой функции.Если ваша система не поддерживает
/dev/fd/n
или ваша оболочка не может использовать именованные каналы для подстановки процесса, то здесь вам придется иметь дело с именованными каналами вручную .источник
Вы должны использовать именованный канал для этого.
Сначала создайте один в папке:
Затем используйте эту команду:
Примечание:
cat
-часть, теперь может бытьgzip
или любой другой , который может читать из трубы:Объяснение:
Вывод записывается на имя трубы (
foo.pipe
), где другой proccess (cat
,gzip
,netcat
) считывает информацию с. Таким образом, вы не потеряете каналы stdout / stderr для получения информации.источник
umask 077
(или использовать частный временный каталог) для предотвращения чтения или записи в него другими процессами (во многих системах именованные каналы, как и другие файлы, создаются по умолчанию для чтения всем миром), 2) вы должны убедиться, что именованный канал используется только каждым экземпляром вашего сценария (опять же, помогает одноразовый частный временный каталог). 3) Это означает, что вам нужно выполнить очистку впоследствии или в случае прерывания.p="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
--index-file
Опция GNU tar работает хорошо:источник