Apparemment, je ne connais pas toutes les destinations de sortie disponibles. Je connais stdout
( &1
) et stderr
( &2
). Cependant, après avoir redirigé les deux descripteurs, j'obtiens parfois encore une sortie dans ma console!
L'exemple le plus simple auquel je peux penser est GNU Parallel; Chaque fois que je l'utilise, je vois un avis de citation. Même quand je le fais &2>1 > file
, je vois toujours l'avis.
Et la même chose s'applique à emerge
: Lorsque je lance emerge et qu'il y a des problèmes, certaines informations ne sont pas imprimées sur stdout
ni stdin
, car je les redirige et elles continuent de passer.
Je résout principalement ces problèmes en utilisant script
, mais je me demande toujours ce qui cause ce problème.
bash
terminal
io-redirection
MatthewRock
la source
la source
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
désactivera le message ennuyeux. Vous pouvez également rechercher d'autres implémentations deparallel
.parallel
comme exemple.Réponses:
La syntaxe que vous avez utilisée est incorrecte.
sera divisé en
Cette volonté:
cmd
tant que tâche d'arrière-plan sans redirectionstderr
vers un fichier appelé littéralement1
et redirigerastdout
versfile
La syntaxe que vous souhaitez est:
L'ordre des opérations est important. Cette volonté:
stdout
versfile
stderr
vers&1
- c'est- à -dire le même descripteur de fichier questdout
Le résultat est que les deux
stderr
etstdout
seront redirigés versfile
.Dans
bash
, une syntaxe non standard plus simple (et donc je ne le recommande pas, pour des raisons de portabilité)cmd &> file
fait la même chose.la source
/dev/tty
, mais j'espère que cela ne se produit pas trop souvent (voire pas du tout).at
commande sur votre machine et que vous disposez des privilèges pour l'utiliser, vous pouvez exécuter la commande viaat now
. Voir la page de manuel pour plus de détails. Cela exécutera la commande via un mécanisme de traitement par lots et le processus n'aura jamais de terminal sur lequel écrire. Mais, en général, je ne m'inquiéterais pas de ce cas de bord. En règle générale, seuls les processus nécessitant une interaction et doivent délibérément afficher des éléments aux utilisateurs malgré la redirection seront utilisés/dev/tty
.Il y a deux problèmes.
Le premier est que l'ordre est important, le second l'est
/dev/tty
.Utilisons ce script comme exemple de script à partir duquel nous voulons capturer la sortie:
test.sh
:Voyons maintenant les sorties des commandes:
./testmyscript.sh 2>&1 >/dev/null
:Parce que l'ordre d'évaluation est de gauche à droite, nous obtenons d'abord "rediriger
stderr
vers n'importe oùstdout
est la sortie (donc, la sortie de la console)". Ensuite, nous obtenons "redirigerstdout
vers/dev/null
. Nous nous retrouvons avec une situation comme celle-ci:stdout
->/dev/null
stderr
-> consoleNous avons donc bien compris:
./testmyscript.sh >/dev/null 2>&1
Et nous obtenons:
ttdada
.Maintenant, nous faisons "Rediriger
stdout
vers/dev/null
", puis "Rediriger stderr vers l'endroit où stdout pointe" (donc,/dev/null
). Hourra!Cependant, nous avons toujours un problème; programme imprime sur
/dev/tty
. Maintenant, je ne sais pas comment résoudre ce type de comportement, vous aurez donc très probablement besoinscript
, mais j'espère que ce comportement ne se produira pas trop souvent.la source