Parfois, vous souhaitez rediriger à la fois stdout et stderr vers le même emplacement, c'est quand >&
est utilisé - il pointe un descripteur de fichier vers un autre.
Par exemple, si vous souhaitez écrire à la fois stdout et stderr dans le même fichier (que ce /dev/null
soit ou output.txt
), vous pouvez les rediriger séparément, avec
app 1>/dev/null 2>/dev/null
ou vous pouvez rediriger un descripteur de fichier vers le fichier, et l'autre descripteur de fichier dans le premier:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Dans le premier exemple, 2>&1
pointe le descripteur de fichier # 2 vers l'endroit où # 1 pointe déjà. Le deuxième exemple obtient le même résultat, commençant simplement par stderr à la place.
Comme autre exemple, il y a des cas où stdout (descripteur de fichier # 1) pointe déjà vers l'emplacement souhaité, mais vous ne pouvez pas y faire référence par son nom (il peut être associé à un tuyau, une prise ou autre). Cela se produit souvent lorsque vous utilisez l'expansion de processus (les opérateurs ` `
ou $( )
), qui ne capture normalement que stdout, mais vous souhaiterez peut-être y inclure stderr. Dans ce cas, vous utiliseriez également >&
pour pointer stderr vers stdout:
out=$(app 2>&1)
Un autre exemple courant est un pageur, ou grep
un utilitaire similaire, car le canal |
ne fonctionne normalement que sur stdout, vous redirigez stderr vers stdout avant d'utiliser le canal:
app 2>&1 | grep hello
Comment savoir lequel 2>&1
ou qui 1>&2
est correct? Le descripteur de fichier déjà configuré va à droite de >&
et le descripteur de fichier que vous souhaitez rediriger va à gauche. ( 2>&1
signifie "pointer le descripteur de fichier # 2 vers le descripteur de fichier # 1".)
Certains shells ont des raccourcis pour les redirections courantes; voici des exemples de Bash:
app 1>/dev/null 2>&1
signifierait que 2> & 1 pointerait vers le fichier vers lequel 1 était déjà en train de rediriger. Je suppose que je pourrais tout aussi facilement le faireapp > /dev/null &>
?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
. Que voulez-vous dire par le descripteur de fichier déjà configuré? Que signifie le droit de?Une situation où vous en avez besoin est lorsque vous souhaitez afficher la
strace
sortie dans un pager.strace
imprime sa sortie à l' erreur standard et les tuyaux connectent généralement la sortie standard à l'entrée standard, vous devez donc utiliser la redirection:la source
pipes generally connect standard output to standard input
?|
) prend la sortie standard de la première commande et la connecte à l'entrée standard de la deuxième commande.Parfois, vous souhaitez rediriger à la fois
stdout
(1
) etstderr
(2
) vers le même emplacement (/dev/null
, par exemple). Un moyen d'y parvenir serait:Mais la plupart des gens raccourcissent cela en redirigeant
stderr
versstdout
avec2>&1
:Une version encore plus courte est:
la source
2: C'est lorsque vous aurez une sortie provenant à la fois d'une erreur standard et d'une sortie standard, et que vous souhaiterez les composer en une seule chaîne.
1: Lorsque vous souhaitez manipuler la sortie de l'erreur standard et de la sortie standard.
la source
>2
est envoyé à / dev / null. Ou ai-je complètement mal compris?Je l'utilise pour démarrer un travail détaché:
alors je peux me déconnecter, et certains programmes seront toujours en cours d'exécution. La fonctionnalité est fournie par GNU Screen, tmux et certains autres programmes - mais ici, elle est réalisée sans aucune dépendance externe.
la source
nohup
oudisown
dans de tels cas.Imaginez qu'il existe un répertoire nommé
try
contenant ces trois fichiers:file file1 and file2.
Exécutez maintenant cette commande:
Les trois premiers fichiers s'ouvrent mais
cat
génèrent une erreur lors de l'ouverture du quatrième car il n'existe pas.Maintenant, lancez:
Vous ne verrez aucune sortie à l'écran: Tout d' abord
1>outfile
redirigera la sortie de la commandeoutfile
puis il redirigera (2>&1
) l'erreur jeté en essayant d'ouvrirfile3
àoutfile
.1>&2
fonctionne de manière similaire et redirige le flux d'erreurs vers la sortie standard.J'espère que cela t'aides!
la source
Utilisez la
tty
commande dans chaque terminal pour les identifier:En supposant que ces ATS, pour rediriger la sortie standard du premier vers le second, exécutez ceci dans le premier terminal:
Pour restaurer le comportement par défaut stdout de pts / 0:
Voir cette vidéo pour une démonstration.
la source
Le cas de la redirection de stderr vers stdout a déjà été traité ici (par exemple, utilisez-le pour filtrer (grep) les messages d'erreur).
L'autre cas redirige stdout vers stderr. Une utilisation courante (au moins pour moi) consiste à envoyer des avertissements / messages d'erreur imprimés avec "echo" (dans mes scripts shells) au stderr (afin qu'ils puissent attirer plus facilement l'attention de l'utilisateur).
Par exemple,
la source