Jeg prøver å omdirigere stderr til stdout og deretter ut til en fil i et init-skript, men når jeg introduserer stderr til stdout får jeg feilen «Ambiguous output redirect». Stdout alene resulterer ikke i feilen, og skriver til loggfilen der jeg uttalte. Jeg har prøvd 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 &
Eventuelle råd vil bli verdsatt.
Kommentarer
Svar
Hvis du kjører (t) csh, får du Ambiguous output redirect.
hvis du prøver å sette opp to motstridende omdirigeringer:
> echo foo > a > b Ambiguous output redirect.
I Bash kan du få en lignende feil hvis du bruker en matrise med flere elementer i stedet for filnavnet:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Som nevnt i svarene til stderr-omdirigering fungerer ikke i csh fungerer >&
-operatøren i (t) csh for å omdirigere både stdout og stderr. 2>&1
er standard måte å omdirigere stderr til samme sted som stdout, men (t) csh støtter ikke det. I stedet tar det kombinasjonen > foo 2>&1
som en omdirigering til foo
, et vanlig argument 2
, og en omdirigering til 1
, og omdirigeringene kommer i konflikt, så du får feilen.
>&
fungerer også i Bash og zsh, men er ikke en standardfunksjon.
Svar
Den andre oppføringen skal fungere bra. Feilen «tvetydig omdirigering» skjer noen ganger hvis du enten har mellomrom der de ikke burde være, eller omvendt når et viktig mellomrom mangler.
Jeg vil forenkle kommandoen din for å demonstrere:
echo "Test" >/tmp/x.txt 2>&1 &
«> /tmp/x.txt» -delen omdirigerer stdout (filhåndtak nr. 1). Et mellomrom mellom> og filnavnet er tillatt (selv om det er i denne sammenhengen ville være forvirrende), men ellers burde det ikke være noen mellomrom her inne.
2> & 1 omdirigerer stderr (filhåndtak 2) til hvilken fil som helst håndtak 1 går til (som er stdout). Det må heller ikke være noen mellomrom her.
& vil bakgrunnen for oppgaven din. Dette må kompenseres med mellomrom fra forrige tegn.
Å reversere de to omdirigeringene fungerer ikke (selv om ekko er et dårlig valg her siden det ikke gir stderr-utdata):
echo "This will not work" 2>&1 >/tmp/x.txt &
Dette betyr:
2>&1
Omdiriger filhåndtak 2 til hvor filhåndtak 1 går (som på dette punktet fortsatt er konsollen)
>/tmp/x.txt
Omdirigere filhåndtak 1 til en fil – men siden filhåndtak 2 (stderr) er allerede omdirigert på dette tidspunktet, vil den beholde destinasjonen og fortsatt gå til konsollen.
Den første kommandoen du skrev er ganske enkelt en syntaksfeil.
echo &>/tmp/x.txt
Oppdatering : @Wildcard påpekte i kommentarene at dette faktisk er gyldig syntaks.
Kommentarer
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Den kan inneholde plassen.command >out.txt
==command > out.txt
- Du har rett; Jeg gjorde en feil der. Å fikse det.
- " Den første kommandoen du skrev er ganske enkelt en syntaksfeil. " Nei, den ' er ikke; det ' er den foretrukne Bash-syntaksen for omdirigering av både stdout og stderr. Se
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @ Wildcard – takk. Jeg slutter aldri å lære!
echo &> foo
. (2) Ikke gi eksempler på kommandoer som er asynkrone hvis du ikke trenger det. (3) Lær om skjell. Det er mer enn ett skall i Unixverse, og de aksepterer forskjellige kommandosyntakser. Lær hvordan du forteller hvilket skall du bruker.