Child_process.execSync kullanın ancak çıktıyı konsolda tutun


160

execSyncNodeJS 0.12 eklenen ancak yine de ben düğüm komut dosyası koştu konsol penceresinde çıktı var yöntemi kullanmak istiyorum .

Örneğin, aşağıdaki satırı içeren bir NodeJS komut dosyası çalıştırırsanız, konsol içinde "live" rsync komutunun tam çıktısını görmek istiyorum:

require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');

Bunun execSynckomutun çıkışını döndürdüğünü ve yürütmeden sonra konsola yazdırabildiğimi anlıyorum, ancak bu şekilde "canlı" çıktım yok ...

Yanıtlar:


324

İstediğiniz buysa , ebeveynin stdio'sunu alt sürece geçirebilirsiniz :

require('child_process').execSync(
    'rsync -avAXz --info=progress2 "/src" "/dest"',
    {stdio: 'inherit'}
);

3
Bu, çocuk sürecinin ebeveynin stdin, stdout ve stderr akışlarını kullanacağı anlamına gelir. Bu nedenle, alt süreç bunlardan birine yazdığında, aslında doğrudan ebeveyn akışına yazılır.
gregers

7
Resmi belgeler beklenen sözdizimi hakkında tam olarak açık olmadığından, bu çok değerli bir cevaptır.
15:15

49
Yerine [0,1,2]ben kullandım 'inherit'eşdeğer olan [process.stdin, process.stdout, process.stderr]veya [0,1,2]olduğu gibi başına dokümanlar
Kurt

10

2
@Booligoosh Basitçe eklemek yerine, {stdio:'inherit'}.toString () öğesini eklemeniz ve sonuçla birlikte console.log'u elle çağırmanız gerekir. Buna ek olarak, "canlı" komut çıktısını görmek için soru gereksinimini bile karşılamıyor. Bunun "çok daha basit" olduğunu düşünmüyorum, aslında bunun daha basit olduğunu düşünmüyorum.
boileau

19

Sadece kullanabilirsiniz .toString().

var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);

Bu Düğüm üzerinde test edilmiştir, v8.5.0önceki sürümlerden emin değilim. @Etov'a göre , işe yaramıyor v6.3.1- aralarında emin değilim.


3
Bu bir hata üzerinde çalışmaz (durum kodu! = 0) çünkü .execSync()bir Errorörnek atar .
Álvaro González

Benim için çalışmıyor, yani çıktı yalnızca komut bittikten sonra yazılıyor. Bu belirli bir sürüm için geçerli mi? düğümüm -v: v6.3.1
etov 28:17

Lütfen yalnızca belirli düğüm sürümleri için geçerli olduğunu belirtmek için cevabı güncelleyin - bu başkaları için daha yararlı olacaktır
etov

1
Komut sırasında çıktı ile ilgili soruyla ilgili olarak şu anda aşağı oy veriliyor.
karfau

14

Stdout ve stderr'i kabul edilen yanıtın önerdiği gibi yönlendirmezseniz, execSync veya spawnSync ile bu mümkün değildir. Stdout ve stderr yönlendirilmeden bu komutlar yalnızca komut tamamlandığında stdout ve stderr öğelerini döndürür.

Bunu stdout ve stderr'i yönlendirmeden yapmak için, bunu yapmak için spawn kullanmanız gerekecek, ancak oldukça basit:

var spawn = require('child_process').spawn;

//kick off process of listing files
var child = spawn('ls', ['-l', '/']);

//spit stdout to screen
child.stdout.on('data', function (data) {   process.stdout.write(data.toString());  });

//spit stderr to screen
child.stderr.on('data', function (data) {   process.stdout.write(data.toString());  });

child.on('close', function (code) { 
    console.log("Finished with code " + code);
});

Hızlı bir şekilde test edebilmeniz için dosyaları özyinelemeli olarak listeleyen bir ls komutu kullandım. Spawn ilk argüman olarak çalıştırmaya çalıştığınız çalıştırılabilir adı alır ve ikinci argüman olarak bu çalıştırılabilir dosyaya aktarmak istediğiniz her parametreyi temsil eden bir dizi dizeyi alır.

Ancak, execSync'i kullanmaya ayarlanmışsanız ve herhangi bir nedenle stdout veya stderr'i yeniden yönlendiremiyorsanız, xterm gibi başka bir terminal açabilir ve buna benzer bir komut iletebilirsiniz:

var execSync = require('child_process').execSync;

execSync("xterm -title RecursiveFileListing -e ls -latkR /");

Bu, komutunuzun yeni terminalde ne yaptığını görmenize izin verir, ancak yine de senkronize çağrıya sahip olursunuz.


2
Spawn kullanan örnek doğru olabilir, ancak execSync'i kullanmakla ilgili olmayan açılış ifadesi doğru değildir. @Gregers
AgDude
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.