Snažím se přesměrovat stderr na stdout a poté ven do souboru v init skriptu, ale když představím stderr na stdout, dostanu chyba „nejednoznačné přesměrování výstupu“. Samotný standardní výstup nevede k chybě a zapíše do souboru protokolu, kde jsem uvedl. Vyzkoušel jsem následující

-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 & 

Jakákoli rada by byla oceněna.

Komentáře

odpověď

Pokud běžíte (t) csh, dostanete Ambiguous output redirect. pokud se pokusíte nastavit dvě konfliktní přesměrování:

> echo foo > a > b Ambiguous output redirect. 

V Bashi se může zobrazit podobná chyba, pokud použijete pole s více prvky namísto názvu souboru:

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

Jak je uvedeno v odpovědích na přesměrování stderr nefunguje v csh , operátor >& pracuje v (t) csh, aby přesměroval stdout i stderr. 2>&1 je standardní způsob přesměrování stderr na stejné místo jako stdout, ale (t) csh to nepodporuje. Místo toho to vyžaduje kombinaci > foo 2>&1 jako přesměrování na foo, běžný argument 2 a přesměrování na 1 a přesměrování je v konfliktu, takže se zobrazí chyba.

>& funguje také v Bash a zsh, ale není to standardní funkce.

Odpověď

Druhá položka by měla fungovat dobře. K chybě „nejednoznačného přesměrování“ někdy dochází, pokud máte mezery tam, kde by neměly být, nebo naopak, když chybí důležitá mezera.

Zjednoduším váš příkaz k prokázání:

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

Část „> /tmp/x.txt“ přesměruje standardní výstup (popisovač souboru č. 1). Mezera mezi> a názvem souboru je povolena (i když v tomto kontextu by to bylo matoucí), ale jinak by zde neměly být mezery.

2> & 1 přesměruje stderr (popisovač souboru 2) na libovolný soubor handle 1 goes to (which is stdout). Ani zde nesmí být mezery.

& bude váš úkol na pozadí. Toto musí být odsazeno s mezerou od předchozího znaku.

Obrácení obou přesměrování nefunguje (ačkoli zde je echo špatná volba, protože neprodukuje výstup stderr):

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

To znamená:

2>&1 

Popisovač přesměrování souboru 2 na kde jde popisovač souboru 1 (což je v tomto okamžiku stále konzole)

>/tmp/x.txt 

Přesměrovat popisovač souboru 1 na soubor – ale protože popisovač souboru 2 (stderr) je již v tomto okamžiku přesměrován, zachová si svůj cíl a stále přejde na konzolu.

První příkaz, který jste napsali, je jednoduše syntaktická chyba.

echo &>/tmp/x.txt 

Aktualizace : @Wildcard v komentářích poukázal na to, že se jedná o skutečně platnou syntaxi.

Komentáře

  • The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.. Může obsahovat mezeru. command >out.txt == command > out.txt
  • Máte pravdu; Udělal jsem tam chybu. Oprava.
  • " První příkaz, který jste napsali, je jednoduše syntaktická chyba. " Ne, je ' s ne; je ' s preferovanou syntaxí Bash pro přesměrování stdout i stderr. Viz LESS='+/Redirecting Standard Output and Standard Error' man bash
  • @Wildcard – děkuji. Nikdy se nepřestanu učit!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *