Existe-t-il un outil Bash standard qui agit comme un écho mais sort vers stderr plutôt que stdout?
Je sais que je peux le faire, echo foo 1>&2
mais c'est un peu moche et, je suppose, sujet aux erreurs (par exemple, plus susceptibles de se tromper lorsque les choses changent).
Réponses:
Vous pouvez le faire, ce qui facilite la lecture:
>&2
copie le descripteur de fichier # 2 dans le descripteur de fichier # 1. Par conséquent, après cette redirection est effectuée, les deux descripteurs de fichiers se référeront au même fichier: le descripteur d' un fichier # 2 a été à l' origine référence. Pour plus d'informations, consultez le didacticiel de redirection illustré de Bash Hackers .la source
alias
script shell. Il serait probablement plus sûr à utilisererrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
, ne fonctionnera pas. Pour faire quelque chose comme ça, vous devrez mettre la redirection quelque part après la dernière pipe comme:errcho(){ echo $@|>&2 pr -To5;}
Vous pouvez définir une fonction:
Ce serait plus rapide qu'un script et sans dépendances.
La suggestion spécifique à bash de Camilo Martin utilise une "chaîne ici" et affichera tout ce que vous lui passerez, y compris les arguments (-n) que l'écho avalerait normalement:
La solution de Glenn Jackman évite également le problème de déglutition des arguments:
la source
echoerr -ne xt
ne va pas imprimer "-ne xt". Mieux vaut l'utiliserprintf
pour ça.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
espaces blancs est envoyé comme un argument séparé, ce qui dans le cas desecho
moyens les concatène avec0x20
s, mais les dangers de ne pas citer beaucoup surestiment la commodité de 2 caractères de moins à taper) .Puisque
1
c'est la sortie standard, vous n'avez pas besoin de la nommer explicitement devant une redirection de sortie comme>
mais à la place vous pouvez simplement taper:Étant donné que vous semblez inquiet de ce que vous
1>&2
aurez du mal à taper de manière fiable, l'élimination du redondant1
pourrait être un léger encouragement pour vous!la source
Une autre option
la source
foo
- a son propre stderr redirigé - par exemplefoo >foo.log 2>&1
- alorsecho foo >/dev/stderr
encombrera toutes les sorties avant lui.>>
devrait être utilisé à la place:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Voir ma réponse ci-dessous :)Non, c'est la façon standard de procéder. Cela ne devrait pas provoquer d'erreurs.
la source
1>&2
. Nous souhaitons tous que cela ne se produise pas, mais je suis sûr que nous avons tous été des endroits où cela se produit.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Oups.Si cela ne vous dérange pas de consigner également le message dans syslog, la méthode not_so_ugly est la suivante:
L'option -s signifie: "Envoyer le message à l'erreur standard ainsi qu'au journal système."
la source
Il s'agit d'une simple fonction STDERR, qui redirige l'entrée de canal vers STDERR.
la source
echo what | /dev/stderr
Remarque: je réponds à la question - pas à la question "écho trompeur / vague qui sort vers stderr" (déjà répondu par OP).
Utilisez une fonction pour montrer l' intention et source l'implémentation que vous souhaitez. Par exemple
Et
error_handling
étant:Raisons qui gèrent les préoccupations du PO:
Autres raisons:
la source
Ma suggestion:
ou
echo "my errz" > /proc/self/fd/2
aura pour effet de sortie ,stderr
car/proc/self
un lien vers le processus en cours, et/proc/self/fd
maintient le processus descripteurs de fichiers ouverts, puis,0
,1
et2
reposerstdin
,stdout
etstderr
respectivement.Le
/proc/self
lien ne fonctionne pas sur MacOS, cependant,/proc/self/fd/*
est disponible sur Termux sur Android, mais pas/dev/stderr
. Comment détecter le système d'exploitation à partir d'un script Bash? peut vous aider si vous devez rendre votre script plus portable en déterminant la variante à utiliser.la source
/proc/self
lien ne fonctionne pas sur MacOS, donc je vais m'en tenir à la/dev/stderr
méthode la plus simple . En outre, comme indiqué dans d'autres réponses / commentaires, il est probablement préférable d'utiliser>>
pour ajouter./proc/self/fd/*
est disponible sur Termux sur Android, mais pas/dev/stderr
.Ne pas utiliser
cat
car certains sont mentionnés ici.cat
est un programme whileecho
etprintf
sont intégrés à bash (shell). Lancer un programme ou un autre script (également mentionné ci-dessus) signifie créer un nouveau processus avec tous ses coûts. En utilisant les fonctions intégrées, les fonctions d'écriture sont assez bon marché, car il n'est pas nécessaire de créer (exécuter) un processus (-environnement).L'opner demande "existe-t-il un outil standard pour sortir ( pipe ) vers stderr", la réponse de schort est: NON ... pourquoi? ... rediriger les tuyaux est un concept élémentaire dans des systèmes comme unix (Linux ...) et bash (sh) s'appuie sur ces concepts.
Je suis d'accord avec l'ouvreur que la redirection avec des notations comme celle-ci:
&2>1
n'est pas très agréable pour les programmeurs modernes, mais c'est bash. Bash n'était pas destiné à écrire des programmes énormes et robustes, il est destiné à aider les administrateurs à y travailler avec moins de touches ;-)Et au moins, vous pouvez placer la redirection n'importe où dans la ligne:
la source
cat
et demander à quelqu'un de ne pas utiliser cat parce qu'il est lent. Il existe d'innombrables cas d'utilisation où le chat est le bon choix, c'est pourquoi je m'oppose à votre réponse.echo
remplacement. Même s'il utilisecat
, il doit utiliser une redirection bash. en tous cas. Donc, il n'y a absolument aucun sens à utilisercat
ici. BTW J'utilisecat
100 fois par jour, mais jamais dans le contexte que l'ouvreur a demandé ... tu l'as compris?Une autre option sur laquelle j'ai récemment trébuché est la suivante:
Cela n'utilise que les Bash intégrés tout en rendant la sortie d'erreur multi-lignes moins sujette aux erreurs (puisque vous n'avez pas à vous rappeler d'ajouter
&>2
à chaque ligne).la source
cat
ou tout autre utilitaire, ce qui est hors sujet pour la question.read
est une commande intégrée au shell qui imprime sur stderr et peut être utilisée comme echo sans effectuer de trucs de redirection:Le
-t 0.1
est un timeout qui désactive la fonctionnalité principale de read, stockant une ligne de stdin dans une variable.la source
Faire un script
ce serait votre outil.
Ou créez une fonction si vous ne voulez pas avoir un script dans un fichier séparé.
la source
Solution de combinaison suggérée par James Roth et Glenn Jackman
la source
Mac OS X: J'ai essayé la réponse acceptée et quelques autres réponses et toutes ont abouti à l'écriture de STDOUT et non de STDERR sur mon Mac.
Voici une façon portable d'écrire sur une erreur standard en utilisant Perl:
la source