Jeg prøver at omdirigere stderr til stdout og derefter ud til en fil i et init script, men når jeg introducerer stderr til stdout får jeg “Ambiguous output redirect” -fejl. Stdout alene resulterer ikke i fejlen og skriver til logfilen, hvor jeg sagde. Jeg har prøvet følgende
-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 &
Ethvert råd vil blive værdsat.
Kommentarer
Svar
Hvis du kører (t) csh, får du Ambiguous output redirect.
hvis du forsøger at opsætte to modstridende omdirigeringer:
> echo foo > a > b Ambiguous output redirect.
I Bash kan du få en lignende fejl, hvis du bruger en matrix med flere elementer i stedet for filnavnet:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Som nævnt i svar til stderr-omdirigering fungerer ikke i csh , >&
operatøren arbejder i (t) csh for at omdirigere både stdout og stderr. 2>&1
er standardmetoden til at omdirigere stderr til samme sted som stdout, men (t) csh understøtter det ikke. I stedet tager det kombinationen > foo 2>&1
som en omdirigering til foo
, et regelmæssigt argument 2
og en omdirigering til 1
, og omdirigeringerne er i konflikt, så du får fejlen.
>&
fungerer også i Bash og zsh, men er ikke en standardfunktion.
Svar
Den anden post skal fungere fint. Fejlen “tvetydig omdirigering” sker undertiden, hvis du enten har mellemrum, hvor de ikke burde være, eller omvendt, når et vigtigt mellemrum mangler.
Jeg vil forenkle din kommando for at demonstrere:
echo "Test" >/tmp/x.txt 2>&1 &
“> /tmp/x.txt” -delen omdirigerer stdout (filhåndtag nr. 1). Et mellemrum mellem> og filnavnet er tilladt (dog i denne sammenhæng ville være forvirrende), men ellers skulle der ikke være nogen mellemrum herinde.
2> & 1 omdirigerer stderr (filhåndtag 2) til hvilken som helst fil håndtag 1 går til (hvilket er stdout). Der må heller ikke være mellemrum herinde.
& vil baggrunde din opgave. Dette skal udlignes med et mellemrum fra det foregående tegn.
At vende de to omdirigeringer fungerer ikke (selvom ekko er et dårligt valg her, da det ikke producerer stderr-output):
echo "This will not work" 2>&1 >/tmp/x.txt &
Dette betyder:
2>&1
Omdiriger filhåndtag 2 til hvor filhåndtag 1 går (som på dette tidspunkt stadig er konsollen)
>/tmp/x.txt
Omdiriger filhåndtag 1 til en fil – men siden filhåndtag 2 (stderr) er allerede omdirigeret på dette tidspunkt, vil den beholde sin destination og stadig gå til konsollen.
Den første kommando, du skrev, er simpelthen en syntaksfejl.
echo &>/tmp/x.txt
Opdatering : @Wildcard påpegede i kommentarerne, at dette faktisk er en gyldig syntaks.
Kommentarer
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Det kan indeholde rummet.command >out.txt
==command > out.txt
- Du har ret; Jeg lavede en fejl der. Løsning.
- " Den første kommando, du skrev, er simpelthen en syntaksfejl. " Nej, det ' er ikke; det ' er den foretrukne Bash-syntaks til omdirigering af både stdout og stderr. Se
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – tak. Jeg holder aldrig op med at lære!
echo &> foo
. (2) Giv ikke eksempler på kommandoer, der er asynkrone, hvis du ikke behøver det. (3) Lær om skaller. Der er mere end en skal i Unixverse, og de accepterer forskellige kommandosyntakser. Lær, hvordan du fortæller, hvilken skal du bruger.