2017-06-12 2 views
0

D'une manière ou d'une autre, je ne trouve pas une réponse suffisante à mon problème, seulement des parties de hackarounds. J'appelle une seule commande shell "chained" (à partir d'une application Node), qui démarre un processus de mise à jour de longue durée, dont stdout/-err doit être remis, comme arguments, à la deuxième partie de la commande shell (une autre application Node qui se connecte à une base de données).STDOUT & STDERR de la commande précédente en tant qu'arguments pour la commande suivante

Je voudrais faire quelque chose comme ceci:

updateCommand 2>$err 1>$out ; logDBCommand --log arg err out 
  • ne pouvez pas utiliser > car il est uniquement pour les fichiers ou les descripteurs de fichiers.
  • Aussi, si j'utilise des variables shell (comme error=$({ updateCommand | sed 's/Output/tmp/'; } 2>&1); logDBCommand --log arg \"${error}.\"), je ne peux avoir que stdout ou les deux mélangés en un seul argument.
  • Et je ne veux pas piper, comme la deuxième commande (logCommand) devrait fonctionner si le premier a réussi ou échoué l'exécution.
  • Et je ne veux pas en cache de fichiers, faire honnêtement ce qui manque le point et d'introduire un autre vecteur d'erreur asynchrone
  • Liste item
+1

Comment serait la mise en cache de fichier provoque une erreur asynchrone? – 123

+0

Avec un tuyau, les deux côtés sont lancés simultanément, bien que chaque côté puisse sortir sur SIGPIPE si une extrémité se ferme, mais si votre 'logCommand' l'a géré avec élégance, il serait difficile de démêler stdout et stderr avec un tuyau –

+0

@ 123, évidemment terminer un programme avec un fichier écrire et le ramasser plus tard est asynchrone et avoir une écriture disque supplémentaire manque le point et n'est pas le point (et pourrait, ne le dis pas, fera un problème pire cas) –

Répondre

0

Après une petite conversation en #!/bin/bash quelqu'un a suggéré de simplement utiliser tpmsf (système de fichiers tenu dans la RAM), qui est le 2ème moyen le plus élégant (mais seulement possible) de le faire. Je peux donc utiliser l'opérateur > et avoir stdout et stderr dans des variables séparées en mémoire.

command1 >/dev/shm/c1stdout 2>/dev/shm/c1stderr 
A=$(cat /dev/shm/c1sdtout) 
B=$(cat /dev/shm/c1stderr) 
command2 $A $B 

(ou moins):

A=$(command1 2>/dev/shm/c1stderr) 
B=$(cat /dev/shm/c1stderr) 
command2 $A $B