O ile mi wiadomo, mogę użyć polecenia tee, aby podzielić standardowe wyjście na ekran i dalsze pliki:
command -option1 -option2 argument | tee file1 file2 file3
Czy można przekierować dane wyjściowe do poleceń zamiast do plików za pomocą tee, aby teoretycznie stworzyć ciąg poleceń?
command-line
pipe
tee
Abdul Al Hazred
źródło
źródło
Odpowiedzi:
Możesz użyć nazwanych potoków ( http://linux.die.net/man/1/mkfifo ) w wierszu poleceń
tee
i mieć odczyt poleceń na nazwanych potokach.Po
command
zakończeniutee
zamyka nazwane potoki, które zasygnalizują EOF (odczyt 0 bajtów) na każdym z nich,/tmp/dataN
który normalnie zakończyłbycmdN
procesy. Prawdziwy przykład:Z powodu procesów w tle powłoka zwróciła monit przed wyjściem programu. Wszystkie trzy przypadki
wc
zakończyły się normalnie.źródło
/tmp/data/{0,1,2}
. Z drugiej strony, w bashu możesz użyć substytucji procesu imkfifo
całkowicie pominąćJeśli dobrze rozumiem, szukasz ekwiwalentu
tee file1 file2 file3
, ale zamiast zapisywać te same dane w trzech plikachfile1
,file2
ifile3
chcesz połączyć te same dane w trzy poleceniacmd1
,cmd2
icmd3
, tj.powinno być równoważne z
z wyjątkiem tego,
…
że wykonano by to tylko raz.Można to zrobić na dwa sposoby.
Ksh93, podstawianie procesów bash i zsh . Jest to uogólnienie potoków, które pozwala argumentowi polecenia być plikiem, który po zapisaniu przekazuje dane jako dane wejściowe do polecenia (istnieje również wariant wejściowy, który po odczytaniu uzyskuje dane wyjściowe polecenia) . To jest,
drukuje
hello
na standardowe wyjście, a ponadto prowadzicmd1
zehello
jako wejście.Na przykład, jeśli chcesz powielić dane wejściowe
somecommand
i przekazać je do obucmd1
icmd2
, możesz użyćJeśli twoja powłoka nie obsługuje zastępowania procesów, możesz zamiast tego użyć nazwanych potoków. Zobacz odpowiedź Arcege, aby dowiedzieć się, jak to działa. Nazwane potoki są mniej wygodne niż podstawianie procesów, ponieważ musisz je utworzyć i usunąć, a także ręcznie uruchomić i zsynchronizować procesy. Mają tę zaletę, że są w pełni przenośne, podczas gdy nie wszystkie powłoki obsługują zastępowanie procesów. Mogą być również używane w scenariuszach innych niż te, dla których proces jest zastępowany.
Pod niektórymi systemami pod maską proces zamiany używa nazwanych potoków wewnętrznie. Jednak w większości systemów korzysta z nazwanych plików reprezentujących deskryptory plików .
źródło
pee
odmoreutils
.Przynajmniej w bashu możesz pominąć
mkfifo
używając substytucji procesu:lub przyjąć przykład Arcege'a
źródło
Dziwi mnie, że nikt nie wspomniał o
pee
poleceniu moreutils ( https://joeyh.name/code/moreutils ).źródło