Ik probeer stderr om te leiden naar stdout en dan naar een bestand in een init-script, maar als ik stderr introduceer in stdout, krijg ik de “Dubbelzinnige uitvoeromleiding” -fout. Stdout alleen resulteert niet in de fout, en schrijft naar het logbestand waarin ik vermeldde. Ik “heb het volgende geprobeerd
-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 &
Elk advies wordt op prijs gesteld.
Opmerkingen
Answer
Als je “(t) csh draait, krijg je Ambiguous output redirect.
als u twee tegenstrijdige omleidingen probeert in te stellen:
> echo foo > a > b Ambiguous output redirect.
In Bash zou u een vergelijkbare fout kunnen krijgen als u een array gebruikt met meerdere elementen in plaats van de bestandsnaam:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Zoals vermeld in antwoorden op stderr-omleiding werkt niet in csh , de >&
operator werkt in (t) csh om zowel stdout als stderr om te leiden. 2>&1
is de standaardmanier om stderr om te leiden naar dezelfde plaats als stdout, maar (t) csh ondersteunt dat niet. In plaats daarvan wordt de combinatie als een omleiding naar foo
, een gewoon argument 2
, en een omleiding naar 1
, en de omleidingen zijn in conflict, dus u krijgt de fout.
>&
werkt ook in Bash en zsh, maar is geen standaardfunctie.
Answer
Het tweede item zou goed moeten werken. De “dubbelzinnige omleiding” -fout treedt soms op als u ofwel spaties heeft waar ze niet zouden moeten zijn, of omgekeerd wanneer een belangrijke spatie ontbreekt.
Ik zou uw commando vereenvoudigen om te demonstreren:
echo "Test" >/tmp/x.txt 2>&1 &
Het gedeelte “> /tmp/x.txt” zal stdout omleiden (bestandsingang # 1). Een spatie tussen de> en de bestandsnaam is toegestaan (hoewel in deze context zou verwarrend zijn), maar verder zouden er hier geen spaties mogen zijn.
De 2> & 1 zal stderr (bestandsingang 2) omleiden naar welk bestand dan ook handle 1 gaat naar (wat stdout is). Er mogen hier ook geen spaties zijn.
De & zal je taak als achtergrond gebruiken. Dit moet worden gecompenseerd met een spatie van het voorgaande teken.
Het omkeren van de twee omleidingen werkt niet (hoewel echo hier een slechte keuze is omdat het geen stderr-uitvoer produceert):
echo "This will not work" 2>&1 >/tmp/x.txt &
Dit betekent:
2>&1
Verwijs bestandshandle 2 naar waar bestandshandvat 1 naartoe gaat (wat op dit punt nog steeds de console is)
>/tmp/x.txt
Verwijs bestandshandvat 1 om naar een bestand – maar sinds bestandshandle 2 (stderr) is al omgeleid op dit punt, zal het zijn bestemming behouden en nog steeds naar de console gaan.
Het eerste commando dat je schreef is gewoon een syntaxisfout.
echo &>/tmp/x.txt
Update : @Wildcard wees in de commentaren erop dat dit in feite een geldige syntaxis is.
Opmerkingen
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Het kan de ruimte bevatten.command >out.txt
==command > out.txt
- Je hebt gelijk; Ik heb daar een fout gemaakt. Oplossen.
- " Het eerste commando dat je schreef is gewoon een syntaxisfout. " Nee, het is ' s niet; het ' is de geprefereerde Bash-syntaxis voor het omleiden van zowel stdout als stderr. Zie
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – bedankt. Ik stop nooit met leren!
echo &> foo
. (2) Geef geen voorbeeldopdrachten die asynchroon zijn als dat niet nodig is. (3) Leer meer over schelpen. Er is meer dan één shell in de Unixverse en ze accepteren verschillende opdrachtsyntaxis. Leer hoe u weet welke shell u gebruikt.