Yritän ohjata stderr: n stdoutiin ja sitten ulos tiedostoon init-komentosarjassa, mutta kun otan stderr: n käyttöön stdoutissa, saan ”Epäselvä ulostulon uudelleenohjaus” -virhe. Stdout yksinään ei aiheuta virhettä ja kirjoittaa lokitiedostoon missä totesin. Olen kokeillut seuraavia
-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 &
Kaikki neuvot olisivat tervetulleita.
Kommentit
Vastaa
Jos olet käynnissä (t) csh, saat Ambiguous output redirect.
jos yrität määrittää kaksi ristiriitaista uudelleenohjausta:
> echo foo > a > b Ambiguous output redirect.
Bashissa saatat saada samanlaisen virheen, jos käytät matriisia jossa on useita elementtejä tiedostonimen sijasta:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Kuten on mainittu vastauksissa stderr-uudelleenohjaukseen ei toimi csh , >&
-operaattori toimii (t) csh -ohjelmassa ohjaamaan sekä stdout että stderr. 2>&1
on tavallinen tapa ohjata stderr samaan paikkaan kuin stdout, mutta (t) csh ”ei tue sitä. Sen sijaan se vie yhdistelmän > foo 2>&1
uudelleenohjauksena osoitteeseen foo
, säännöllisenä argumenttina 2
ja uudelleenohjauksena osoitteeseen 1
ja uudelleenohjaukset ovat ristiriidassa, joten saat virheen.
>&
toimii myös Bashissa ja zsh: ssä, mutta ei vakio-ominaisuus.
Vastaus
Toisen merkinnän pitäisi toimia hyvin. ”Epäselvä uudelleenohjaus” -virhe tapahtuu joskus, jos sinulla on joko välilyöntejä, joissa niiden ei pitäisi olla, tai päinvastoin, kun tärkeä tila puuttuu.
Yksinkertaistan komentoasi osoittamaan:
echo "Test" >/tmp/x.txt 2>&1 &
”> /tmp/x.txt” osa ohjaa stdoutin (tiedoston kahva # 1). Väli> ja tiedostonimen välillä on sallittu (vaikka tässä yhteydessä olisi hämmentävää), mutta muuten täällä ei pitäisi olla välilyöntejä.
2> & 1 ohjaa stderrin (tiedoston kahva 2) mihin tahansa tiedostoon kahva 1 menee (mikä on stdout). Myöskään tässä ei saa olla välilyöntejä.
& taustoittaa tehtävän. Tämä on korvattava välilyönnillä edellisestä merkistä.
Kahden uudelleenohjauksen kääntäminen ei toimi (vaikka kaiku onkin tässä huono valinta, koska se ei tuota stderr-ulostuloa):
echo "This will not work" 2>&1 >/tmp/x.txt &
Tämä tarkoittaa:
2>&1
Ohjaa tiedoston kahva 2 mihin tiedostokahva 1 menee (joka tässä vaiheessa on edelleen konsoli)
>/tmp/x.txt
Ohjaa tiedostokahva 1 tiedostoon – mutta koska tiedostokahva 2 (stderr) on jo uudelleenohjattu tässä vaiheessa, se säilyttää määränpäänsä ja menee edelleen konsoliin.
Ensimmäinen kirjoittamasi komento on yksinkertaisesti syntaksivirhe.
echo &>/tmp/x.txt
Päivitys : @Wildcard huomautti kommenteissa, että tämä on todellakin kelvollinen syntakse.
Kommentit
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Se voi sisältää tilaa.command >out.txt
==command > out.txt
- Olet oikeassa; Tein virheen siellä. Korjaus.
- " Ensimmäinen kirjoittamasi komento on yksinkertaisesti syntaksivirhe. " Ei, se ' ei; se ' s ensisijainen Bash-syntakse sekä stdoutin että stderrin uudelleenohjaamiseksi. Katso
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – kiitos. En koskaan lopeta oppimista!
echo &> foo
. (2) Älä anna asynkronisia esimerkkikomentoja, jos sinun ei tarvitse. (3) Opi kuorista. Unixversessa on enemmän kuin yksi kuori, ja ne hyväksyvät erilaiset komentosyntaksit. Opi selvittämään käyttämäsi komentotulkki.