2014-07-21 18 views
6

Come posso ottenere gli argomenti della riga di comando prime in un'applicazione node.js, dato questo comando di esempio:ottenere gli argomenti della riga di comando grezzo in node.js

node forwardwithssh.js echo "hello arguments"

process.argv sarà [ "node", "/path/to/forwardwith.js", "echo", "hello arguments" ]

E non c'è modo di ricostruire l'originale echo "hello arguments" da quello (ad esempio join(" " non riporterà le virgolette). Voglio l'intera stringa originale grezza dopo il nome dello script.

quello che voglio è facilmente reperibile negli script di bash con "$*", esiste un modo equivalente per ottenerlo in node.js?

Nota: l'intenzione, in particolare, è quello di ricevere un comando da eseguire da qualche altra parte

+0

Questo modulo dovrebbe essere in grado di fare ciò che si desidera: https://www.npmjs.org/package/minimist –

+0

Non c'è modo di sapere se l'argomento originale è stato specificato come '" ciao argomenti "', '' ciao argomenti'' o 'ciao \ argomenti'. Sono tutti uguali in bash. Vuoi sempre presumere che un argomento con uno spazio fosse originariamente citato con virgolette doppie? È facile vedere che lo spazio deve essere stato sfuggito in qualche modo, perché si ottiene un arg invece di due per "argomenti ciao". – Paulpro

+0

Puoi citare tutti i tuoi argomenti 'process.argv.map (function (arg) {return '"' + arg + '"';});'. Che ti darà: '" nodo "" forwardwithssh.js "" echo "" ciao argomenti "', che è esattamente lo stesso in bash del tuo comando originale. – Paulpro

risposta

3

Avvolgere ognuna delle args tra virgolette singole, e la fuga e apici all'interno di ogni argomento per '\'' (ad esempio attraverso SSH.):

var cmd_string = process.argv.map(function(arg){ 
    return "'" + arg.replace(/'/g, "'\\''") + "'"; 
}).join(' '); 

che si darebbe un cmd_string contenente:

'node' '/path/to/forwardwith.js' 'echo' 'hello arguments' 

che può essere eseguito direttamente in un'altra shell.

+0

Temevo che le virgolette singole non funzionassero sulla shell, ma hai ragione, mi piacerebbe ora avere a che fare con l'escaping ed essere in grado di registrare il comando originale ... ma questa sembra essere la soluzione migliore disponibile – Benja

+0

Non fornisce argomenti di comando originali. 'node x.js y' e 'node x.js "y"' daranno lo stesso process.argv. – wandalen

+0

@wandalen Quelli sono valutati in modo identico in una shell prima che 'node' sia invocato. Se vuoi passare le virgolette in una shell, dovresti avere 'node x.js \ 'y \'' o 'node x.js '' y '" '. – Paulpro

Problemi correlati