Quelle méthode dois-je utiliser pour écrire des messages d'erreur à "stderr " aide' printf' dans un script bash?
Je veux diriger la sortie d'un printf
dans un bash
script pour stderr
au lieu de stdout
.
Je suis pas de demander à propos de la redirection soit stderr
ou stdout
de l'endroit où ils sont actuellement acheminés. Je veux juste être en mesure d'envoyer la sortie d'une printf
à stderr
au lieu de la valeur par défaut de stdout
.
J'ai testé un peu et a trouvé que l'ajout de 1>&2
à la printf
, comme illustré dans l'exemple ci-dessous, qui semble faire ce que je veux. Cependant, j'ai pas expérience de l'utilisation de bash. Donc, mon primaire question est de savoir si il y a un "mieux" moyen de le faire dans bash
?
Par "mieux" je veux dire, est-il une autre façon de faire ce qui est plus couramment utilisé, plus classiques, ou plus idiomatique? Comment serait un plus expérimentés bash programmeur de le faire?
#!/bin/bash
printf "{%s} This should go to stderr.\n" "$(date)" 1>&2
printf "[(%s)] This should go to stdout.\n" "$(date)"
J'ai aussi un secondaire question. Je demande non pas parce que je besoin savoir, mais plus parce que je suis curieux et que vous souhaitez avoir une meilleure compréhension de ce qui se passe.
Il semble que le ci-dessus ne fonctionnera que lorsqu'il s'exécute à l'intérieur d'un script shell. Il ne semble pas fonctionner quand je l'ai essayer en ligne de commande.
Voici un exemple de ce que je veux dire.
irrational@VBx64:~$ printf "{%s} Sent to stderr.\n" "$(date)" 1>&2 2> errors.txt
{Sat Jun 9 14:08:46 EDT 2012} Sent to stderr.
irrational@VBx64:~$ ls -l errors.txt
-rw-rw-r-- 1 irrational irrational 0 Jun 9 14:39 errors.txt
J'attendrais la printf
de commande au-dessus de ne pas avoir de sortie parce que la sortie doit aller à stderr
, qui à son tour devrait aller vers un fichier. Mais cela n'arrive pas. Hein?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, oui,
1>&2
est la bonne chose à faire.Deuxièmement, la raison de votre
1>&2 2>errors.txt
exemple ne fonctionne pas est parce que les détails de exactement ce que la redirection ne.1>&2
signifie "faire descripteur de fichier 1 point à l'endroit où descripteur de fichier 2 le fait aujourd'hui" — c'est à dire des trucs qui ont été écrits sur la sortie standard stdout va maintenant vers stderr.2>errors.txt
signifie "ouvrir un descripteur de fichier pourerrors.txt
et faire descripteur 2 point à lui" — c'est à dire des trucs qui ont été écrits sur la sortie stderr maintenant va danserrors.txt
. Mais descripteur de fichier 1 n'est pas affecté du tout, les choses tellement écrit sur la sortie standard stdout va encore stderr.La bonne chose à faire est de
2>errors.txt 1>&2
, qui fera de l'écrit à la fois stderr et stdout aller àerrors.txt
, parce que la première opération sera "ouverterrors.txt
et faire stderr point à elle", et le second de l'opération de "faire stdout le point où stderr pointe maintenant".2>errors.txt 1>&2
est ce que je doit avoir eu l'intention de l'utiliser. Je me sens stupide, avec le recul, mais cela semble être une de ces erreurs stupides que j'ai à faire tant que la bonne façon de faire devient "évident" pour moi. 😉 Merci beaucoup pour le comprendre.Qui me semble raisonnable. Vous n'avez pas besoin de la
1
, cependant, il va fonctionner ainsi, mais il est implicite:Vous avez un ordre d'opérations problème:
1>&2
est légèrement moins ambigu que simplement>&2
. Non? (Par ce que je veux dire, plus clairement ce qui se passe pour une personne qui regarde le script. bash n'est évidemment pas de soins.)>&2
est plus idiomatique que1>&2
.La question semble indiquer une certaine confusion. Vous ne voulez pas rediriger stdout, vous voulez juste avoir printf envoyer la sortie vers stderr... Mais pour cela, vous devez utiliser la redirection.
Le printf de commande envoie toujours normal de la production à sa sortie standard (stdout). C'est ce que printf. Afin d'obtenir ce que vous voulez, vous devez avoir le shell en sorte que stdout temporairement points à l'endroit où vous souhaitez la sortie pour aller. Remarquez que je dis temporairement. Lorsque vous tapez une commande comme
le shell modifie la sortie standard (stdout) de la poignée pour la durée de l'exécution de l'instruction printf. Puis la coquille restaure la valeur d'origine de la sortie standard (stdout) avant de poursuivre avec la prochaine commande. En fait, si vous souhaitez rediriger la sortie standard (stdout) de façon permanente, vous devez utiliser la commande spéciale
Après le shell a signé le présent, le shell ne se souvient plus de la valeur d'origine de la sortie standard (stdout) de la poignée.
Typique des idiomes sont: