Powszechnie wiadomo, jak przełączyć standardowe wyjście procesu na standardowe wejście innego procesu:
proc1 | proc2
Ale co, jeśli chcę wysłać błąd standardowy proc1 do proc2 i pozostawić standardowe wyjście w jego bieżącej lokalizacji? Można by pomyśleć, że bash
miałoby polecenie w stylu:
proc1 2| proc2
Ale niestety nie. Czy jest na to sposób?
rc
, w którym jest inna powłoka. Npproc1 |[2] proc2
. : . Czy to nie miłe?bash
Ale nie w środku.Odpowiedzi:
Istnieje również substytucja procesu . Co sprawia, że proces zastępuje plik.
Możesz wysłać
stderr
do pliku w następujący sposób:Ale możesz podstawić proces dla pliku w następujący sposób:
Oto konkretny przykład, który wysyła
stderr
zarówno na ekran, jak i dołącza do pliku dziennikaźródło
weston --help 2> >(less)
) i zepsuło mi skorupę, musiałem wyjść i zalogować się ponownie.weston --help
iless
spodziewają się interakcji z klawiaturą, ale tylko 1 z nich ją otrzyma, możesz być w niezręcznej sytuacji.grep
Zamiast tego spróbuj przeprowadzić testy za pomocą czegoś takiego . Dodatkowo może się okazać, że oba wejścia myszy / klawiatury i tak przechodzą do drugiego polecenia, a nie do westona.Możesz użyć następującej sztuczki, aby zamienić
stdout
istderr
. Następnie wystarczy użyć zwykłej funkcji potoku.Pod warunkiem,
stdout
istderr
zarówno wskazał tym samym miejscu na początku, to da ci to, czego potrzebujesz.To, co
x>y
robi bit, to zmiana uchwytu pliku,x
więc wysyła teraz informacje do miejsca, w którym uchwyt plikuy
wskazuje. W naszym konkretnym przypadku:3>&1
tworzy nowy uchwyt,3
który będzie wyprowadzany do bieżącego uchwytu1
(oryginalne standardowe wyjście), tylko po to, aby zapisać go gdzieś na ostatni punkt poniżej.1>&2
modyfikuje uchwyt1
(stdout), aby wyprowadzał do bieżącego uchwytu2
(oryginalny stderr).2>&3-
modyfikuje uchwyt2
(stderr), aby wyprowadzał do bieżącego uchwytu3
(oryginalne standardowe wyjście), a następnie zamyka uchwyt3
(przez-
na końcu).W rzeczywistości jest to polecenie swap, które widzisz w algorytmach sortowania:
źródło
1>&2-
tutaj, a nie tylko1>&2
? Nie rozumiem, dlaczego chcielibyśmy zamknąć fd2
, jeśli zamierzamy go natychmiast ponownie otworzyć / przypisać.Bash 4 ma tę funkcję:
zsh ma również tę funkcję.
-
W przypadku innych / starszych powłok, po prostu wprowadź to wyraźnie jako
FirstCommand 2> & 1 | OtherCommand
źródło
OtherCommand
zapisuje połączone dane gdzieś, prawdopodobnie gdzie indziej. Więc to nie są te same dane i potencjalnie są przenoszone gdzie indziej. To jest przeciwieństwo życzenia PO, prawda?proc1
wyjście na stdout i na stderr i chcesz, aby stderr przeszedł do stdinproc2
(czyli tam, gdzie zmierza stdout proc1), wtedy moja odpowiedź to robi. Dałem OP to, o co prosił , a może nie to, o co chciał poprosić. Na tym polega potencjalna dwuznaczność. OP przyjął odpowiedź, która zamienia stdout i stderr, co nie jest tym, o co prosił.Zamiana jest świetna, ponieważ rozwiązuje problem. Na wypadek, gdybyś nie potrzebował nawet oryginalnego standardowego wyjścia, możesz to zrobić w ten sposób:
Porządek jest niezbędny; nie chciałbyś:
Ponieważ to przekieruje wszystko do
/dev/null
!źródło
Żaden z nich nie działał naprawdę dobrze. Najlepszy sposób, w jaki znalazłem robienie tego, co chciałeś, to:
Działa to tylko w przypadkach, w których
command
nie jest wymagane wprowadzanie danych z klawiatury. na przykład:umieściłby błędy gzip w less
źródło