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!
echo &> foo
. (2) Nedávejte ukázkové příkazy, které jsou asynchronní, pokud nemusíte. (3) Další informace o granátech. V Unixverse je více než jeden shell a přijímají různé syntaxe příkazů. Naučte se, jak zjistit, jaký shell používáte.