2016-06-22 3 views
0

Unten habe ich eine Zeichenfolge mit Zeilenumbrüchen, diese Zeichenfolge ist der Inhalt einer Bash-Datei. Ich habe mich gefragt, ob es eine Möglichkeit gibt, diesen Inhalt auszuführen, ohne die Bash-Datei zu erstellen. Ich möchte etwas wie unten tun, wo ich den Inhalt einfach an den sh Befehl übergebe. Aber das blies mit dem Fehler unten auf.Erstellen eines untergeordneten Prozesses einer Bash-Datei in Knoten

let string = "\necho \'hello-world\'\n" 

execAsync(`${string} | sh`) 

Ich weiß, ich kann eine temporäre Datei/exec es mit dem Pfad entspricht das aktuelle Arbeitsverzeichnis/löschen Sie die Datei erstellen. Aber ich würde lieber nicht die Schwierigkeiten durchgehen, wenn es eine Möglichkeit gibt, das Skript auszuführen, ohne eine Datei zu erstellen.

Fehler:

{ Error: Command failed: 
echo 'hello-world' 
| sh 
/bin/sh: -c: line 2: syntax error near unexpected token `|' 
/bin/sh: -c: line 2: ` | sh' 

    at ChildProcess.exithandler (child_process.js:207:12) 
    at emitTwo (events.js:106:13) 
    at ChildProcess.emit (events.js:191:7) 
    at maybeClose (internal/child_process.js:852:16) 
    at Socket.<anonymous> (internal/child_process.js:323:11) 
    at emitOne (events.js:96:13) 
    at Socket.emit (events.js:188:7) 
    at Pipe._handle.close [as _onclose] (net.js:492:12) 
    cause: 
    { Error: Command failed: 
    echo 'hello-world' 
    | sh 
    /bin/sh: -c: line 2: syntax error near unexpected token `|' 
    /bin/sh: -c: line 2: ` | sh' 

     at ChildProcess.exithandler (child_process.js:207:12) 
     at emitTwo (events.js:106:13) 
     at ChildProcess.emit (events.js:191:7) 
     at maybeClose (internal/child_process.js:852:16) 
     at Socket.<anonymous> (internal/child_process.js:323:11) 
     at emitOne (events.js:96:13) 
     at Socket.emit (events.js:188:7) 
     at Pipe._handle.close [as _onclose] (net.js:492:12) 
    killed: false, 
    code: 2, 
    signal: null, 
    cmd: '\necho \'hello-world\'\n | sh' }, 
    isOperational: true, 
    killed: false, 
    code: 2, 
    signal: null, 
    cmd: '\necho \'hello-world\'\n | sh' } 
+1

'lassen string = "\ Nechos \ 'Hallo Welt \'"' - man kann nicht eine neue Zeile in einem Shell mit 'Anfang |' – PSkocik

Antwort

0

Führen Sie die Skriptinhalte an die Shell durch die -c Option. Es wird von den meisten Shells unterstützt.

Beispiel:

var execAsync = require('exec-async'); 

let script = "echo \'hello\' $(whoami)\nls -l\necho 'bye'" 

execAsync('sh', ['-c', script]).then(console.log).catch(console.log);