Eu preciso na função node.js
result = execSync('node -v');
que executará de forma síncrona a linha de comando especificada e retornará todos os valores padrão desse texto de comando.
ps. A sincronização está errada. Eu sei. Apenas para uso pessoal.
ATUALIZAR
Agora temos a solução do mgutz, que nos dá o código de saída, mas não o stdout! Ainda esperando por uma resposta mais precisa.
ATUALIZAR
mgutz atualizou sua resposta e a solução está aqui :)
Além disso, como dgo.a mencionado, há um módulo autônomo exec-sync
ATUALIZAÇÃO 30-07-2014
A lib do ShellJS chegou. Considere que esta é a melhor escolha por enquanto.
ATUALIZAÇÃO 10-02-2015
FINALMENTE! O NodeJS 0.12 suporta execSync
nativamente.
Veja documentos oficiais
Respostas:
O Node.js (desde a versão 0.12 - por um tempo) suporta
execSync
:Agora você pode fazer isso diretamente:
e fará o que você espera. (O padrão é canalizar os resultados de E / S para o processo pai). Observe que você também pode
spawnSync
agora.fonte
Veja a biblioteca execSync .
É bastante fácil fazer isso com o node-ffi . Eu não recomendaria para processos de servidor, mas para utilitários de desenvolvimento geral, isso é feito. Instale a biblioteca.
Script de exemplo:
[EDIT junho 2012: como obter STDOUT]
fonte
stdout
disso? Tudo o que posso obter é o código de saída do processoexecSync
não faz partechild_process
. Eu acho que deveria ser.Use o módulo ShellJS .
função exec sem fornecer retorno de chamada.
Exemplo:
fonte
exec()
consome muita CPU para processos longos.const execSync = require('child_process').execSync; code = execSync('node -v');
Existe um excelente módulo para controle de fluxo no node.js chamado asyncblock . Se a quebra do código em uma função for boa para o seu caso, o seguinte exemplo pode ser considerado:
fonte
exec-sync
ouffi
no Windows tem uma sobrecarga enorme (VC ++, SDKs, Python, etc), mas isso é mais leve.Isso não é possível no Node.js, ambos
child_process.spawn
echild_process.exec
foram criados a partir do zero para serem assíncronos.Para detalhes, consulte: https://github.com/ry/node/blob/master/lib/child_process.js
Se você realmente deseja ter esse bloqueio, coloque tudo o que precisa acontecer posteriormente em um retorno de chamada ou crie sua própria fila para lidar com isso de maneira bloqueadora, suponho que você possa usar o Async.js para esta tarefa.
Ou, caso você tenha muito tempo para gastar, entre no Node.js por conta própria.
fonte
Esta é a maneira mais fácil que encontrei:
fonte
Apenas para adicionar que, embora existam poucos casos de uso em que você deve usá-los,
spawnSync
/execFileSync
/execSync
foram adicionados ao node.js nesses commits: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748efonte
Você pode conseguir isso usando fibras. Por exemplo, usando minha biblioteca Common Node , o código ficaria assim:
fonte
Eu me acostumei a implementar
"synchronous"
coisas no final da função de retorno de chamada. Não é muito bom, mas funciona. Se você precisar implementar uma sequência de execuções de linha de comando, precisará envolverexec
em alguma função nomeada e chamá-la recursivamente. Esse padrão parece ser útil para mim:fonte
Eu tive um problema semelhante e acabei escrevendo uma extensão de nó para isso. Você pode conferir o repositório git. É de código aberto, gratuito e todas essas coisas boas!
https://github.com/aponxi/npm-execxi
As instruções de uso estão no arquivo Leia-me . Sinta-se livre para fazer solicitações pull ou enviar problemas!
EDIT:
No entanto, ele ainda não retorna o stdout ... Apenas gera em tempo real.Faz agora.Acabei de lançar hoje. Talvez possamos construir sobre isso.Enfim, achei que valeria a pena mencionar.
fonte
npm install
bem-sucedido (em outras palavras, quando o plug-in é compilado), então é bom começar a produção. Além de direcionar diferentes versões do nodejs, eu diria que está corrigido para produção ou que é bastante estável. Se houver algum erro você pode enviar uma solicitação de recebimento ou publicar um problema no github :)você pode executar operações shell síncronas no nodejs da seguinte maneira:
EDIT - este exemplo é para ambientes Windows, ajuste para suas próprias necessidades de Linux, se necessário
fonte
Na verdade, tive uma situação em que precisava executar vários comandos um após o outro a partir de um script de pré-instalação package.json de uma maneira que funcionasse no Windows e Linux / OSX, por isso não podia confiar em um módulo não essencial.
Então é isso que eu criei:
Você pode usá-lo assim:
EDIT: como indicado, isso realmente não retorna a saída ou permite que você use o resultado dos comandos em um programa Node. Uma outra idéia para isso é usar backcalls do LiveScript. http://livescript.net/
fonte