2017-10-20 21 views
2

J'ai une commande shell qui fonctionne bien dans le terminal mais quand il est exécuté par les erreurs child_process du nœud.Comportement de tuyau bizarre dans le child_process du noeud?

Voici la commande telle qu'elle est utilisée dans le terminal (file.json est un fichier JSON):

cat /tmp/file.json | jq 

Voici exécute la même commande à partir child_process:

var cp = require("child_process"); 

var command = "cat /tmp/gen_json | jq"; 
cp.exec(command, function(err, stdout, stderr) { 
    stderr ? console.log(stderr) : console.log(stdout); 
}); 

qui produit:

jq - commandline JSON processor [version 1.5-1-a5b5cbe] 
Usage: jq [options] <jq filter> [file...] 

    jq is a tool for processing JSON inputs, applying the 
    given filter to its JSON text inputs and producing the 
    ... 

Ceci est le message par défaut qui s'affiche lors de l'exécution de jq. C'est comme si je courais jq sans le tuyau précédent.

+0

Non liée au comportement de conduite, mais vous ne avez pas besoin 'cat' ici (Si c'est la vraie commande que vous exécutez). Essayez 'jq '..filtre ..'/tmp/fichier.json'. – randomir

+0

@randomir dans mon cas j'ai besoin de 'cat' parce que si je lance' jq/tmp/fichier.json' il casse avec 'inattendu '/''. Je ne reçois pas cette erreur quand je laisse 'cat' analyser le fichier avant' jq'. (question mise à jour avec pastebin à json) –

+1

On dirait que 'jq' attend un filtre obligatoire, Essayez:' cat file | jq '.' Cela résout votre autre problème, aussi: 'jq '.' fichier ». – randomir

Répondre

1

La prise est dans jqattempts to intelligently infer the default filter, si le filtre a été omis.

A savoir, lorsque la sortie passe à un terminal (ATS), le filtre peut être omis, et par défaut . (assez impression). Voilà pourquoi dans le terminal que vous pouvez écrire:

cat file | jq   # or: jq < file 

au lieu de:

cat file | jq .   # or: jq . file 

Appelé à partir node, cependant, avec stdin et stdout redirigés, jqnécessite le filtre l'argument. C'est pourquoi vous devez spécifier explicitement:

var command = "cat /tmp/gen_json | jq ."; 

ou, encore mieux (pour éviter l'abus félin):

var command = "jq . /tmp/gen_json"; 
+1

'jq '.'' peut être simplifié à:' jq.' – peak

+1

C'est vrai, mis à jour. Merci! – randomir