Est-il possible de combiner les sorties de ces deux commandes?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Aucune des commandes ne se termine, donc je ne sais pas comment faire cela.
bash
io-redirection
chovy
la source
la source
Réponses:
Vous pouvez combiner deux commandes en la regroupant avec
{ }
:jusqu'à présent, vous pouvez rediriger le groupe vers un fichier (le dernier
;
avant}
est obligatoire):si vous voulez séparer
STDOUT
etSTDERR
dans deux fichiers:la source
;
avant}
, c'est obligatoire!{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
idéal ne rien imprimer si les lignes ne sont pas brisées.&&
au lieu de&
!command1 & command2
- ceci exécute commande1 en arrière-plan et démarre immédiatement commande2, exécutant ainsi les deux commandes en parallèle et perturbant la sortie.command1 && command2
- ceci exécute commande1 (au premier plan), puis, si commande1 est intégrée, commande2.Plus généralement, il est possible d'utiliser un sous-shell ou un groupe de commandes et de rediriger la sortie de l'ensemble du groupe en même temps.
Code:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
La principale différence entre les deux réside dans le fait que le premier divise un processus enfant, tandis que le second opère dans le contexte du shell principal. Cela peut avoir des conséquences sur la définition et l'utilisation de variables et d'autres paramètres d'environnement, ainsi que sur les performances.
N'oubliez pas que le crochet de fermeture du groupe de commandes (et des fonctions) doit être séparé du contenu par un point-virgule ou un retour à la ligne. En effet, il
"}"
s’agit en réalité d’une commande (mot-clé) qui doit être traitée comme telle.la source
( )
fonctionne bien aussi.}
n'est pas une commande du tout. C'est un mot réservé. Même chose pour{
. Je l' habitude d' écrire ces listes comme ceci:{ command1;command2;} > outfile.txt
. Vous pouvez ajouter des espaces après les points-virgules, mais ce n'est pas nécessaire. L'espace après{
est nécessaire, cependant.( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
idéal ne rien imprimer si les lignes ne sont pas brisées. (H / t à @antak).( command1 && command2 && command3 ) | cat
()
car avec les accolades,{}
cela fonctionne comme un progrès en arrière-plan et ensuite vous devez traiter le résultat. Aussi pipe au chat `| cat` est une alternative plus intéressante que `> / dev / stdout`J'ai fini par le faire, les autres suggestions ne fonctionnaient pas, car la 2e commande avait été tuée ou n'avait jamais été exécutée.
la source
tail -f *.log
bien que je n’aie jamais vu cela comme un problème avec 2 processus différents écrivant dans le même fichier journal.yes {1..20}
command2 =yes {1..20}
et diriger la sortie combinée à travers| grep -v '^1 2 3'
laquelle, idéalement, ne rien imprimer si les lignes ne sont pas rompues. (H / t à @antak).Essaye ça:
la source
À ce jour, la plupart des solutions s’attaquent mal au problème de la ligne partielle. Supposons pendant une seconde que les programmes sont:
Lorsque vous exécutez ceux-ci en parallèle, vous voulez que la sortie ait des lignes complètes de
a
s suivies de lignes complètes deb
s. Ce que vous ne voulez pas, c'est mélangera
s etb
s sur la même ligne (tr -s ab
remplace la répétitiona
par un seula
, il est donc plus facile de voir ce qui se passe):Si vous utilisez plutôt GNU Parallel, vous obtenez de belles lignes complètes avec
a
s oub
s mais jamais mélangées:Les versions les plus récentes de GNU Parallel évitent même de remplir votre disque: les opérations ci-dessus peuvent durer indéfiniment.
la source
Puisque vous utilisez déjà
node
, vous voudrez peut-être essayer simultanémentla source
Pour le cas particulier de la combinaison de plusieurs sorties de commande BASH sur une seule ligne, voici une recette pour exécuter chaque commande à son tour, en supprimant les nouvelles lignes entre leurs sorties.
Par exemple, le code ci-dessous incorporera un message ASCII entre deux chaînes d'octets fixes (formant une commande d'impression, dans ce cas).
(Remarque: cette méthode ne fonctionne que si les commandes sont fermées. Pour combiner stdout à partir de commandes non fermées, voir les autres réponses.)
la source