Jag försöker omdirigera stderr till stdout och sedan ut till en fil i ett init-skript, men när jag introducerar stderr till stdout får jag ”Ambiguous output redirect” -felet. Enbart Stdout resulterar inte i felet och skriver till loggfilen där jag angav. Jag har försökt följande
-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 &
Alla råd skulle uppskattas.
Kommentarer
Svar
Om du kör (t) csh får du Ambiguous output redirect.
om du försöker ställa in två motstridiga omdirigeringar:
> echo foo > a > b Ambiguous output redirect.
I Bash kan du få ett liknande fel om du använder en matris med flera element i stället för filnamnet:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Som nämnts i svaren på stderr omdirigering fungerar inte i csh , >&
operatören arbetar i (t) csh för att omdirigera både stdout och stderr. 2>&1
är det vanliga sättet att omdirigera stderr till samma plats som stdout, men (t) csh stöder inte det. I stället tar det kombinationen > foo 2>&1
som en omdirigering till foo
, ett vanligt argument 2
och en omdirigering till 1
, och omdirigeringarna kommer i konflikt, så du får felet.
>&
fungerar också i Bash och zsh, men är inte en standardfunktion.
Svar
Den andra posten ska fungera bra. Felet ”tvetydig omdirigering” händer ibland om du antingen har mellanslag där de inte borde vara, eller omvänt när ett viktigt utrymme saknas.
Jag skulle förenkla ditt kommando för att visa:
echo "Test" >/tmp/x.txt 2>&1 &
”> /tmp/x.txt” -delen omdirigerar stdout (filhandtag nr 1). Ett mellanrum mellan> och filnamnet är tillåtet (även om det är i detta sammanhang skulle vara förvirrande), men annars borde det inte finnas några mellanslag här.
2> & 1 omdirigerar stderr (filhandtag 2) till vilken fil som helst handtag 1 går till (vilket är stdout). Det får inte heller finnas några mellanslag här.
& kommer att bakgrunda din uppgift. Detta måste kompenseras med ett mellanslag från föregående tecken.
Omvändning av de två omdirigeringarna fungerar inte (även om eko är ett dåligt val här eftersom det inte ger stderr-utdata):
echo "This will not work" 2>&1 >/tmp/x.txt &
Detta betyder:
2>&1
Omdirigera filhandtag 2 till vart filhandtag 1 går (som vid den här tiden fortfarande är konsolen)
>/tmp/x.txt
Omdirigera filhandtag 1 till en fil – men eftersom filhandtag 2 (stderr) är redan omdirigerad vid denna tidpunkt kommer den att behålla sin destination och ändå gå till konsolen.
Det första kommandot du skrev är helt enkelt ett syntaxfel.
echo &>/tmp/x.txt
Uppdatering : @Wildcard påpekade i kommentarerna att detta faktiskt är giltig syntax.
Kommentarer
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Det kan innehålla utrymmet.command >out.txt
==command > out.txt
- Du har rätt; Jag gjorde ett misstag där. Åtgärda det.
- " Det första kommandot du skrev är helt enkelt ett syntaxfel. " Nej, det ' är inte; det ' är föredragen Bash-syntax för omdirigering av både stdout och stderr. Se
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @ Wildcard – tack. Jag slutar aldrig lära mig!
echo &> foo
. (2) Ge inte exempelkommandon som är asynkrona om du inte behöver. (3) Lär dig om skal. Det finns mer än ett skal i Unixverse, och de accepterar olika kommandosyntaxer. Lär dig hur du berättar vilket skal du använder.