2017-02-16 3 views
-1

Я не уверен, как спросить, но я бы хотел запустить команду «bash» в окнах 10, чтобы некоторые команды linux запускались позже. Я использую структуру «Электрон» и «Детский процесс».Как запускать команды терминала linux на окнах?

var os = require('os') 
var exec = require('child_process').exec 
if (os.platform() =='win32'){ 
    var cmd_win = 'bash' 
    exec(cmd_win, function(error, stdout, stderr){ 
     console.log(error) 
    }); 
} 

Фрагмент кода дает «Ошибка: команда не выполнена: bash». Кто-нибудь знает, почему? И можете ли вы мне помочь? Надеюсь, ты понял мой вопрос.

ответ

-1

По умолчанию exec будет использовать cmd.exe для выполнения команд в окнах. Возможно, вам нужна опция shell, указанная в the docs.

shell Shell to execute the command with (Default: '/bin/sh' on UNIX, 'cmd.exe' on Windows, The shell should understand the -c switch on UNIX or /s /c on Windows. On Windows, command line parsing should be compatible with cmd.exe.)

const os = require('os') 
const exec = require('child_process').exec 

if (os.platform() === 'win32') { 
    exec('ls', {shell: 'path/to/executable.exe'}, (err, stdout, stderr) => { 
    if (err) { 
     console.error(err) 
     return 
    } 

    console.log(stdout) 
    }) 
} 
+0

Цель OP состоит в том, чтобы запустить 'bash.exe' _ самостоятельно, без аргументов_ (чтобы запустить его в фоновом режиме, чтобы инициализировать подсистему WSL, если я правильно понимаю), не передавать _commands_, поэтому в принципе default shell ('cmd') должен быть точным, так как должен использоваться немного более эффективный' execFile() 'be. Однако ни один из методов не работает с этим конкретным исполняемым файлом ('bash.exe'). – mklement0

1

Для инициализации подсистемы WsL, необходимо запустить (скрытый) Баш окно консолив фоновом режиме, который не работает, если вы выполняете bash.exeнепосредственно - она ​​работает с ни exec не execFile.

Хитрость заключается в том, чтобы получить оболочку (cmd) процесса, который Node.js нерестится запустить bash.exeбез блокировки, который, к сожалению, не так легко сделать: start не может быть использован, так как bash.exe является консоли применение и поэтому составляет start акт синхронно.

Решение заключается в создании aux. VBScript, который запускает bash.exe, который сам может быть вызван асинхронно через wscript.exe. Обратите внимание, что окно Bash консоль запускается скрытый:

var os = require('os') 
var exec = require('child_process').exec 
if (os.platform() === 'win32') { 
    var cmd_win = '\ 
    echo WScript.CreateObject("Shell.Application").\ 
     ShellExecute "bash", "", "", "open", 0 > %temp%\launchBashHidden.vbs \ 
    & wscript %temp%\launchBashHidden.vbs' 
    exec(cmd_win, function(error, stdout, stderr){ 
     if (error) console.error(error) 
    }); 
} 

Обратите внимание, что на доп. Файл VBScript %temp%\launchBashHidden.vbs задерживается между вызовами. Очистка после каждого прогона потребует дополнительной работы (вы не можете просто удалить его сразу, потому что wscript, из-за асинхронного запуска, возможно, его еще не загрузили).

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