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.
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.
Réponses:
Vous pouvez combiner deux commandes en la regroupant avec { }
:
{ command1 & command2; }
jusqu'à présent, vous pouvez rediriger le groupe vers un fichier (le dernier ;
avant }
est obligatoire):
{ command1 & command2; } > new_file
si vous voulez séparer STDOUT
et STDERR
dans deux fichiers:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
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.
( )
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.
alias app () {
nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
echo $! > /tmp/api.pid
nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
echo $! > /tmp/client.pid
tail -f /tmp/log
}
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:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
À ce jour, la plupart des solutions s’attaquent mal au problème de la ligne partielle. Supposons pendant une seconde que les programmes sont:
cmd1() {
perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2
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 de b
s. Ce que vous ne voulez pas, c'est mélanger a
s et b
s sur la même ligne ( tr -s ab
remplace la répétition a
par un seul a
, il est donc plus facile de voir ce qui se passe):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Si vous utilisez plutôt GNU Parallel, vous obtenez de belles lignes complètes avec a
s ou b
s mais jamais mélangées:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
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.
Puisque vous utilisez déjà node
, vous voudrez peut-être essayer simultanément
Exécutez plusieurs commandes simultanément. J'aime
npm run watch-js & npm run watch-less
mais mieux.
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.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
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).
# hex prefix encode a message as hex hex suffix | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n' | xxd -r -p | nc -N 192.168.192.168 9100
(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.)