Normalne polecenie tar
tar cvf foo.tar ./foo >foo.out 2>foo.err
ma trzy wyjściowe strumienie we / wy
- zarchiwizuj dane na foo.tar
- lista nazw plików do STDOUT (przekierowane do foo.out)
- komunikaty o błędach do STDERR (przekierowane do foo.err)
Następnie mogę sprawdzić foo.err pod kątem komunikatów o błędach bez konieczności czytania listy nazw plików.
jeśli chcę coś zrobić z danymi archiwalnymi (przepuszczać przez netcat lub specjalny program do kompresji), mogę użyć -f -
opcji tar
tar cvf - ./foo 2>foo.err | squish > foo.tar.S
Ale teraz moja lista nazw plików jest mieszana z moimi komunikatami o błędach, ponieważ -v
dane wyjściowe tar oczywiście nie mogą przejść do STDOUT (tam, gdzie przepływają dane archiwalne), więc tar sprytnie zapisuje je do STDERR.
Za pomocą powłoki Korna istnieje sposób na zbudowanie polecenia, które potokuje strumień archiwum do innego polecenia, ale nadal przechwytuje dane -v
wyjściowe niezależnie od komunikatów o błędach.
tee
? Wydaje się, że jest to całkiem uzasadniony przypadek użycia.Odpowiedzi:
Jeśli twój system obsługuje
/dev/fd/n
:Które z implementacjami AT&T
ksh
(bash
lubzsh
) możesz napisać za pomocą podstawienia procesu :Robi to dokładnie to samo, tyle że tym razem powłoka decyduje, którego deskryptora pliku użyć zamiast
3
(zwykle powyżej 9). Kolejna różnica polega na tym, że tym razemtar
zamiast statusu otrzymujesz status wyjściasquish
. W systemach, które nie obsługują/dev/fd/n
, niektóre powłoki mogą korzystać z nazwanych potoków dla tej funkcji.Jeśli twój system nie obsługuje
/dev/fd/n
lub powłoka nie może użyć nazwanych potoków do zastąpienia procesu, wtedy musisz ręcznie poradzić sobie z nazwanymi potokami .źródło
W tym celu musisz użyć nazwanego potoku.
Najpierw utwórz go w folderze:
Następnie użyj tego polecenia:
Wskazówka:
cat
-part, może być teraz takżegzip
czy cokolwiek innego, że może czytać z potoku:Wyjaśnienie:
Wyjście jest napisane na rurze (nazwa
foo.pipe
), gdzie inny proccess (cat
,gzip
,netcat
) odczytuje z. Więc nie tracisz kanałów stdout / stderr dla informacji.źródło
umask 077
(lub użyć prywatnego katalogu tymczasowego), aby uniemożliwić innym procesom odczytywanie lub zapisywanie w nim (w wielu systemach nazwane potoki, podobnie jak inne pliki są domyślnie tworzone do odczytu na świecie), 2) musisz zapewnić nazwany potok jest używany tylko przez każde wystąpienie skryptu (ponownie pomaga jednorazowy prywatny katalog tymczasowy) 3) Oznacza to, że musisz wyczyścić później lub jeśli zostanie przerwany.p="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
--index-file
Opcja GNU tar działa dobrze:źródło