Próbuję przekierować stderr na stdout, a następnie do pliku w skrypcie inicjującym, ale kiedy wprowadzam stderr do stdout, otrzymuję błąd „Niejednoznaczne przekierowanie wyjścia”. Samo standardowe wyjście nie powoduje błędu i zapisuje do pliku dziennika, w którym podałem. Próbowałem następujących rozwiązań

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log & -jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 & 

Każda rada byłaby mile widziana.

Komentarze

Answer

Jeśli korzystasz z (t) csh, otrzymasz , jeśli spróbujesz skonfigurować dwa sprzeczne przekierowania:

> echo foo > a > b Ambiguous output redirect. 

W Bash możesz otrzymać podobny błąd, jeśli użyjesz tablicy z wieloma elementami zamiast nazwy pliku:

$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect 

Jak wspomniano w odpowiedziach na przekierowanie stderr nie działa csh , operator >& działa w (t) csh w celu przekierowania zarówno stdout, jak i stderr. 2>&1 to standardowy sposób przekierowania stderr w to samo miejsce, co standardowe wyjście, ale (t) csh tego nie obsługuje. Zamiast tego przyjmuje kombinację > foo 2>&1 jako przekierowanie do foo, zwykły argument 2 i przekierowanie do 1 i konflikt przekierowań, więc pojawia się błąd.

>& działa również w Bash i zsh, ale nie jest to standardowa funkcja.

Odpowiedź

Drugi wpis powinien działać poprawnie. Błąd „niejednoznacznego przekierowania” czasami pojawia się, jeśli masz spacje tam, gdzie nie powinny, lub odwrotnie, gdy brakuje ważnej spacji.

Uprościłbym twoje polecenie, aby zademonstrować:

echo "Test" >/tmp/x.txt 2>&1 & 

Część „> /tmp/x.txt” przekieruje standardowe wyjście (uchwyt pliku nr 1). Spacja między znakiem> a nazwą pliku jest dozwolona (chociaż w tym kontekście byłoby mylące), ale w przeciwnym razie nie powinno tu być żadnych spacji.

2> & 1 przekieruje stderr (uchwyt pliku 2) do dowolnego pliku uchwyt 1 przechodzi do (co jest wyjściem standardowym). Tutaj też nie może być żadnych spacji.

& będzie w tle twojego zadania. To musi być przesunięte ze spacją z poprzedniego znaku.

Odwrócenie dwóch przekierowań nie działa (chociaż echo jest tutaj złym wyborem, ponieważ nie generuje wyjścia stderr):

echo "This will not work" 2>&1 >/tmp/x.txt & 

Oznacza to:

2>&1 

Przekieruj uchwyt pliku 2 do gdzie idzie uchwyt pliku 1 (który w tym momencie jest nadal konsolą)

>/tmp/x.txt 

Przekieruj uchwyt pliku 1 do pliku – ale ponieważ uchwyt pliku 2 (stderr) jest już przekierowany w tym momencie, zachowa swoje miejsce docelowe i nadal będzie przechodził do konsoli.

Pierwsze napisane polecenie to po prostu błąd składni.

echo &>/tmp/x.txt 

Aktualizacja : @Wildcard wskazał w komentarzach, że jest to faktycznie poprawna składnia.

Komentarze

  • The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.. Może zawierać przestrzeń. command >out.txt == command > out.txt
  • Masz rację; Popełniłem tam błąd. Naprawianie tego.
  • " Pierwsze napisane polecenie to po prostu błąd składniowy. " Nie, to ' s nie; ' to preferowana składnia Bash do przekierowywania zarówno stdout, jak i stderr. Zobacz LESS='+/Redirecting Standard Output and Standard Error' man bash
  • @Wildcard – thanks. Nigdy nie przestaję się uczyć!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *