Electron JS ile Shell Komutları Çalıştırmak

Hasan Adıgüzel
3 min readFeb 19, 2021

--

Electron JS kullanarak shell / komut satırı komutlarını çalıştırıp, çalıştırdığımız komutların ürettiği cevaplarını nasıl elde edebileceğimizi bu makalede anlatacağım. Electron JS ile shell komutlarını işleyebilmek için child_process modülünü kullanacağız.

child_process modül ana electron.js sürecinin yeni alt süreçlerini oluşturur. Bu alt süreçlerle shell komutlarını çalıştırabiliriz. child_process modülü ile shell komutlarını işleyebilmek için exec ve spawn fonksiyonlarını kullanacağız.

exec() Fonksiyonu

exec() fonksiyonu yeni bir shell oluşturur ve belirli bir komutu çalıştırır. exec() fonksiyonunun komut çalıştırma özelliğinden gelen çıktı arabelleğe alınır, yani bellekte tutulur ve bir geri aramada kullanılmak üzere hazır olarak bekler.

exec() fonksiyonunu mevcut dizinimizdeki tüm klasör ve dosyaları listelemek için kullanalım . Electron JS projemizin çalışma dizininde lsExec.js isimli bir dosya oluşturarak aşağıda yer alan kodları oluşturduğumuz dosyanın içerisine yazalım.

Yukarıda bulunan kodda ilk olarak child_process modülünü programımıza entegre ediyoruz. Ardından exec() fonksiyonunu iki parametre kullanarak çalıştırıyoruz. Kullandığımız parametrelerin sırasıyla;

  • Çalıştırılmasını istediğimiz shell komutuna ait bir dize.
  • Üç parametreye sahip bir geri çağırma fonksiyonu: error, stdout, stderr.

Yukarıdaki kodda çalıştırdığımız shell komutu olanls -al, gizli dosyalar / klasörler dahil olmak üzere mevcut dizinimizdeki tüm dosya ve klasörleri satır satır listelemelidir. Geri çağırma fonksiyonu parametrelerimizden ilki olan error parametresi ile exec() fonksiyonu çalıştırılırken oluşabilecek hataları elde ediyoruz, stderr parametresi ile exec() fonksiyonunun çalıştırdığı shell komutunun bir hata fırlatıp fırlatmadığını ve stdout parametresi ile de exec() fonksiyonunun çalıştırdığı shell komutu başarılı ise komut çıktısını elde ediyoruz.

Yukarıda yer alan kodu çalıştırdığımız zaman aşağıdaki görselde yer alan ekran çıktısını elde ederiz.

Görsel: exec() Fonksiyonu Console Çıktısı

spawn() Fonksiyonu

spawn() fonksiyonu yeni bir işlemde bir komut yürütür. Bu işlev bir Akış API’ si kullanır, bu nedenle komutun çıktısı dinleyiciler aracılığıyla kullanıma sunulur.

Öncekine benzer şekilde, mevcut dizinimizdeki tüm klasör ve dosyaları listelemek için spawn() işlevini kullanacağız. Electron JS projemizin çalışma dizininde lsSpawn.js isimli bir dosya oluşturarak aşağıda yer alan kodları oluşturduğumuz dosyanın içerisine yazalım.

child_process modülünden spawn() fonksiyonunu başlatıyoruz. Daha sonra, argüman olarak -la’ yı seçerek ls komutunu çalıştıran yeni bir işlem oluşturuyoruz. Argümanların bir dizide nasıl tutulduğuna ve komut dizesine dahil edilmediğine dikkat edin.

Ardından dinleyicilerimizi kodluyoruz. ls komutu stdout nesnesine veri yazdığı atadığı zaman bir veri olayı başlatıyoruz ve başlattığımız veri olayı ile stdout nesnesinden gelen argümanları elde ediyoruz. Benzer şekilde, stderr nesnesine bir veri atandığı zaman yeni bir veri olayı ile stderr nesnesinden gelen argümanları elde ediyoruz.

Hataları, doğrudan komutun referansını depolayan nesne üzerinde dinleyerek yakalıyoruz. child_process modülümüz işlevini yerine getirmezse bir hata ile karşılaşmamız kaçınılmazdır.

ls komutuna bağladığımız close olayı ise komut bittiğinde çalıştırılacak fonksiyonu çağırır.

lsSpawn.js dosyamızı çalıştırdığımız zaman exec() fonksiyonunda elde ettiğimiz ekran çıktısını aldığımızı gözlemleyebiliriz.

exec() ve spawn() Fonksiyonlarından Hangisini Tercih Etmeliyim?

exec() ve spawn() arasındaki temel fark, verileri nasıl döndürdükleridir. exec() tüm çıktıyı bir ara bellekte depoladığından, çıktıyı geldikçe aktaran spawn() fonksiyonundan daha fazla bellek kullanır.

Genellikle, büyük miktarda verinin döndürülmesini beklemiyorsanız, basit olması için exec() kullanabilirsiniz. Kullanım durumlarının iyi örnekleri, bir klasör oluşturmak veya bir dosyanın durumunu almaktır. Ancak, komutunuzdan büyük miktarda çıktı bekliyorsanız, o zaman spawn() fonksiyonunu kullanmalısınız. İyi bir örnek, ikili verileri işlemek için komut kullanmak ve ardından bunu Electron JS uygulamanıza yüklemek olabilir.

Sonuç

Electron JS, standart child_process modülünü kullanarak shell komutlarını çalıştırabilir. exec() fonksiyonunu kullanırsak, komutumuz çalışacak ve çıktısı bir değişken ile bize ulaşacaktır. spawn() fonksiyonunu kullanırsak, çıktısını olay dinleyiciler aracılığıyla elde etmiş oluruz.

Uygulamanız komutlarımızdan çok fazla çıktı bekliyorsa, exec() yerine spawn() tercih etmeliyiz. Değilse, basitliği için exec() kullanmayı tercih edebiliriz.

Yazar: Hasan Adıgüzel, Şubat 2021

Web Sitesi: http://hasanadiguzel.com.tr

--

--