Jessaye de rediriger stderr vers stdout puis vers un fichier dans un script init, mais quand jintroduis stderr vers stdout, jobtiens lerreur « Redirection de sortie ambiguë ». Stdout seul nentraîne pas lerreur et écrit dans le fichier journal où jai indiqué. Jai essayé ce qui suit
-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 &
Tout conseil serait apprécié.
Commentaires
Answer
Si vous « exécutez (t) csh, vous obtenez Ambiguous output redirect.
si vous essayez de configurer deux redirections en conflit:
> echo foo > a > b Ambiguous output redirect.
Dans Bash, vous pourriez obtenir une erreur similaire si vous utilisez un tableau avec plusieurs éléments à la place du nom de fichier:
$ set aa bb $ echo foo > "$@" bash: "$@": ambiguous redirect
Comme mentionné dans les réponses à la redirection stderr ne fonctionne pas dans csh , lopérateur >&
fonctionne dans (t) csh pour rediriger à la fois stdout et stderr. 2>&1
est le moyen standard de rediriger stderr vers le même endroit que stdout, mais (t) csh ne prend pas en charge cela. À la place, il prend la combinaison > foo 2>&1
comme redirection vers foo
, un argument normal 2
et une redirection vers 1
, et les redirections sont en conflit, vous obtenez donc lerreur.
>&
fonctionne également dans Bash et zsh, mais ce nest pas une fonctionnalité standard.
Réponse
La deuxième entrée devrait fonctionner correctement. Lerreur « redirection ambiguë » se produit parfois si vous avez des espaces là où ils ne devraient pas être, ou inversement quand un espace important manque.
Je simplifierais votre commande pour démontrer:
echo "Test" >/tmp/x.txt 2>&1 &
La partie « > /tmp/x.txt » redirigera stdout (descripteur de fichier # 1). Un espace entre le> et le nom du fichier est autorisé (bien que dans ce contexte serait déroutant), mais sinon il ne devrait y avoir aucun espace ici.
Le 2> & 1 redirigera stderr (descripteur de fichier 2) vers nimporte quel fichier la poignée 1 va à (qui est stdout). Il ne doit pas non plus y avoir despaces ici.
Le & sera larrière-plan de votre tâche. Cela doit être décalé avec un espace à partir du caractère précédent.
Inverser les deux redirections ne fonctionne pas (bien que lécho soit un mauvais choix ici car il ne produit pas de sortie stderr):
echo "This will not work" 2>&1 >/tmp/x.txt &
Cela signifie:
2>&1
Redirige le descripteur de fichier 2 vers où va le descripteur de fichier 1 (qui à ce stade est toujours la console)
>/tmp/x.txt
Redirige le descripteur de fichier 1 vers un fichier – mais depuis le descripteur de fichier 2 (stderr) est déjà redirigé à ce stade, il conservera sa destination et ira toujours à la console.
La première commande que vous avez écrite est simplement une erreur de syntaxe.
echo &>/tmp/x.txt
Mise à jour : @Wildcard a souligné dans les commentaires quil sagit en fait dune syntaxe valide.
Commentaires
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
. Il peut contenir de lespace.command >out.txt
==command > out.txt
- Vous avez raison; Jai fait une erreur là-bas. Correction du problème.
- " La première commande que vous avez écrite est simplement une erreur de syntaxe. " Non, cest ' nest pas; il ' est la syntaxe Bash préférée pour rediriger à la fois stdout et stderr. Voir
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcard – merci. Je narrête jamais dapprendre!
echo &> foo
. (2) Ne donnez pas dexemples de commandes asynchrones si vous nêtes pas obligé de le faire. (3) Renseignez-vous sur les coquillages. Il y a plus dun shell dans lUnixverse, et ils acceptent différentes syntaxes de commande. Découvrez comment identifier le shell que vous utilisez.