En bash.
J'ai du mal à déterminer ce que je devrais utiliser?
tous mes scripts utilisent ">> / dev / stderr"
à l' invite bash, si je tente:
echo test >>/dev/stderr
travaux
echo test >> /dev/stderr
travaux
echo test >/dev/stderr
travaux
echo test > /dev/stderr
travaux
echo test >>&2
ÉCHOUE!
echo test >> &2
ÉCHOUE!
echo test >&2
fonctionne
echo test > &2
FAILS!
Je souhaite changer tous mes scripts en >&2
.
Il semble également avoir un grand effet sur ssh (après su SomeUser
) où >>/dev/stderr
ne fonctionnera pas du tout (autorisation refusée), seulement >&2
fonctionnera.
bash
ssh
io-redirection
stderr
Puissance du Verseau
la source
la source
su
que le problème se produit, a mis à jour la questionsu -c 'some command'
, cette commande est exécutée par/bin/sh
, nonbash
, donc le comportement spécifique à bash (comme la simulation/dev/stderr
à des fins de redirection lorsqu'elle n'est pas disponible) n'est pas garanti d'être présent.Réponses:
>& n
est la syntaxe du shell pour dupliquer directement un descripteur de fichier . Le descripteur de fichier 2 est stderr; c'est comme ça que ça marche. Vous pouvez également dupliquer d'autres descripteurs de fichiers, pas seulement stderr. Vous ne pouvez pas utiliser le mode d'ajout ici car la duplication d'un descripteur de fichier ne tronque jamais (même si votre stderr est un fichier) et>&
est un jeton, c'est pourquoi vous ne pouvez pas y mettre d'espace - mais cela>& 2
fonctionne.>> name
est une syntaxe autorisée différente, oùname
est un nom de fichier (et le jeton est>>
). Dans ce cas, vous utilisez le nom de fichier/dev/stderr
, qui, par une gestion spécifique au système d'exploitation (sous Linux, c'est un lien symbolique/proc/self/fd/2
), signifie également une erreur standard. Les modes ajouter et tronquer finissent tous les deux par faire la même chose lorsque stderr est un terminal car cela ne peut pas être tronqué. Si votre erreur standard est un fichier, cependant, il sera tronqué:Si vous voyez une erreur avec
/dev/stderr
over ssh, il est possible que l'administrateur du serveur ait appliqué une mesure de sécurité empêchant ce lien symbolique de fonctionner. (Par exemple, vous ne pouvez pas accéder à/proc
ou/dev
). Bien que je m'attende à ce que cela cause toutes sortes de bris étranges, l'utilisation de la syntaxe de descripteur de fichier en double est une approche parfaitement raisonnable (et probablement légèrement plus efficace). Personnellement je le préfère.la source
>>
, merci de le signaler! De plus, j'ai raté une étapesu SomeUser
après la connexion via ssh.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
ne tronquera pas tho! (même avec2>&1 |tee /tmp/foo
) ce qui est parfait pour la journalisation, et fonctionnera parfaitement après avoir tout changé>&2
. Donc je suppose que seule une utilisation directe des fichiers/dev/stderr
permet de tronquer, pas le descripteur dupliqué, cool thx!Les cas d'échec se produisent parce que la syntaxe bash pour l'utilisation
&
dans les redirections spécifie un seul>
et requiert qu'il existe directement à côté du&
signe:la source
Utilisez
'>'
pour rediriger (tronque s'il existe) ou'>>'
(ajoute s'il existe).Utilisez
'>&'
pour dupliquer un flux, par exemple, si vous voulez une sortie standard ET une erreur standard dans le même fichier, vous redirigez vers le fichier'> output.log'
et aussi une erreur avec'2>&'
la source