2016-04-09 3 views
-1

Есть ли способ создать и выполнить виртуальный скрипт bash вместо того, чтобы записывать скрипт в файловую систему, а затем выполнять .sh-файл с bash?Создать + выполнить виртуальный скрипт bash

Я использую Node.js, и могут быть библиотеки для создания и выполнения сценария bash; Наверное, мне интересно, как это делается без сохранения файла где-нибудь.

+0

Очень интересный вопрос, но я думаю, что это будет трудно сделать. Вы все еще собираетесь использовать/bin/bash в качестве интерпретатора? – Dandorid

+0

Да, я бы использовал bash для запуска скрипта. Причина, по которой я спрашиваю, заключается в том, что это всего лишь временный файл, который будет перезаписан, потому что контент динамический, в основном список последовательных задач. Поэтому нет необходимости сохранять файл в файловой системе, если я могу избежать его загромождения. –

+0

добавил ответ, дайте мне знать, если вы считаете, что это здорово –

ответ

0

Это может быть сделано следующим образом:

echo 'echo hi' | bash 

очень удобно на самом деле, потому что вам не нужно записывать файлы из на файловой системе; не нужно создавать .sh-файл и запускать его, а затем удалять файл после запуска.

Для использования с Node.js, вы бы запустить его следующим образом:

const cp = require('child_process'); 

const bashCmd = 'echo "echo hello world" | bash'; 

cp.exec(bashCmd, function (err, stdout, stderr) { 

     if (err) { 
      console.error(err.stack); 
     } 

     console.log(stdout); 
     console.error(stderr); 

     process.exit(0); 


    }); 

В настоящее время я использую это для генерации отчетов покрытия стамбульских для наших тестов. Следующий код:

var bash = 'echo "'; 

    const $files = sumanUtils.removeSharedRootPath(files); 

    $files.forEach(function (file) { 

     bash += 'istanbul cover ' + file[0] + ' --dir ./coverage/' + String(file[1]).replace(/\//g,'-') + '\n'; 

    }); 

    bash += 'istanbul report" | bash'; 

    console.log(bash); 


    cp.exec(bash, function (err, stdout, stderr) { 

     if (err) { 
      console.error(err.stack); 
      process.exit(1); 
     } 

     console.log(stdout); 
     console.error(stderr); 

     process.exit(0); 


    }); 

формирует команду Баша, которая выглядит следующим образом:

echo "istanbul cover /Users/amills001c/WebstormProjects/oresoftware/suman/test/build-tests/empty.js --dir ./coverage/empty.js 
istanbul cover /Users/amills001c/WebstormProjects/oresoftware/suman/test/build-tests/test6.js --dir ./coverage/test6.js 
istanbul cover /Users/amills001c/WebstormProjects/oresoftware/suman/test/build-tests/test7-start.js --dir ./coverage/test7-start.js 
istanbul cover /Users/amills001c/WebstormProjects/oresoftware/suman/test/build-tests/test8.js --dir ./coverage/test8.js 
istanbul cover /Users/amills001c/WebstormProjects/oresoftware/suman/test/build-tests/test9.js --dir ./coverage/test9.js 
istanbul report" | bash 
+2

Почему бы вам не попробовать * его? Проведение непроверенной спекуляции в качестве ответа не помогает. –

+0

Просто попробовал, кажется, работает –

+0

Это здорово, и это выглядит легче, чем я ожидал. Но можете ли вы взять вывод из Node.js и подключить его к stdin bash? Можете ли вы позволить Node.js генерировать «эхо-привет»? – Dandorid

Смежные вопросы