Exec Komutunun Kabuk Betiklerinde Kullanımı

Exec Komutunun Kabuk Betiklerinde Kullanimi



Bu kılavuz, exec komutunu ve onun kabuk betiklerindeki kullanımını detaylandırır.

Önkoşullar:

Bu kılavuzda gösterilen adımları gerçekleştirmek için aşağıdaki bileşenlere ihtiyacınız vardır:

  • İşlevsel bir Linux sistemi. Hakkında daha fazla öğren VirtualBox kullanarak bir Ubuntu VM kurma .
  • erişim bir sudo ayrıcalığına sahip root olmayan kullanıcı .
  • Uygun bir metin editörü. Örneğin: Neden / NeoVim , Nano , Yüce metin , VSCodium , vesaire.

Yürütme Komutu

exec komutu kendi başına ayrı bir araç değildir:







$ Hangi yönetici



Aksine, Bash kabuğunun dahili bir komutudur:



$ Adam yönetici





Kılavuz sayfasındaki açıklamadan da anlaşılacağı gibi, bir komut belirtilirse, exec hiçbir ek işlem oluşturmadan kabuğu onunla değiştirir. exec komutunun davranışını değiştiren bir avuç seçenek vardır.



Temel Kullanım

Varsayılan olarak, bir komut çalıştırıldığında, Bash bir alt kabuk oluşturur ve komutu çatallar.

$ Eko $$ && uyumak 999

$ pstree -P

Burada, echo komutu geçerli kabuğun PID'sini yazdırır. Bash kabuğu (PID: 978), uyku komutuyla (PID: 8369) çalışacak yeni bir alt süreç oluşturur.

Şimdi, uyku komutunu exec kullanarak çalıştırırsak ne olur?

$ Eko $$ && yönetici uyumak 999

$ pstree -p

Ana Bash işleminin yerini uyku komutu alır. Başarılı yürütme sonrasında kabuğa geri dönmez. Bunun yerine oturum sonlandırılır.

Temiz çevre

Varsayılan Bash yapılandırması, bir dizi ince ayar ve ortam değişkeni ile birlikte gelir. Bazı senaryolarda (örneğin hata ayıklama), betiğinizi/programınızı temiz bir ortamda çalıştırmak isteyebilirsiniz. exec'in yardımıyla, mevcut olanın yerine temiz bir kabuk örneği başlatabiliriz.

Öncelikle, şu anda yapılandırılmış olan tüm ortam değişkenlerini listelemek için printenv komutunu kullanın:

$ printenv

Şimdi, temiz bir örnek başlatmak için exec'i kullanın:

$ yönetici -C darbe

$ printenv

Farklı Bir Kabuk Başlatmak

Bash ve 'sh' dışında, her birinin kendine özgü avantajları olan çok sayıda başka kabuk programı mevcuttur. Bir program/komut dosyası belirli bir kabuk gerektiriyorsa, mevcut Bash kabuğunu istenen kabukla değiştirmek için exec'i kullanabilirsiniz.

Aşağıdaki örnekte, Bash'i 'sh' ile değiştiriyoruz:

$ pstree -P

$ yönetici sh

$ pstree -P

Exec'i Komut Dosyalarında Kullanma

Temel bilgilerin dışında, artık exec'i kabuk betiklerimizde kullanmaya başlayabiliriz.

Örnek 1: Farklı Kabuklarla Çalışmak

Aşağıdaki komut dosyasına göz atın:

#!/bin/bash

Eko $kabuğu

Eko 'echo zsh başarıyla başlatıldı' > zsh.sh

yönetici zsh zsh.sh

Burada, ilk yankı komutu mevcut kabuğu yazdırır. Varsayılan olarak, Bash olmalıdır. Ardından, exec komutu, 'zsh.sh' betiğini yürütmek için 'zsh'yi başlatır.

Aşağıdaki betiği çalıştırın:

$ . / test.sh

Örnek 2: Mevcut Süreci Geçersiz Kılma

Bir komut/program her çağrıldığında, Bash yeni bir süreç başlatır. Çoğu durumda, endişe konusu değildir. Ancak, çok sınırlı kaynağa sahip bir sistemle çalışırken (örneğin gömülü donanım), bellekteki mevcut işlemi geçersiz kılmak için exec kullanmak yardımcı olabilir.

Aşağıdaki komut dosyasına göz atın:

#!/bin/bash

pstree -P

yönetici pstree -P

Eko 'Selam Dünya'

Burada, ilk pstree komutu işlem ağacının orijinal düzenini gösterir. exec komutu yürütüldüğünde, ikinci pstree komutu çalışan kabuğun yerini alır. Son satırdaki yankı komutu yürütülmedi.

Aşağıdaki betiği çalıştırın:

$ . / test.sh

Komut dosyasının bir parçası olduğu için, başarılı bir yürütmeden sonra orijinal kabuğa geri dönüyoruz.

exec komutu, ana kabuğu farklı bir komut/programla değiştirdiğinden, bundan sonraki herhangi bir kod geçersiz olur. Komut dosyalarınızda bunları kullanırken dikkatli olun.

Örnek 3: Günlüğe kaydetme

Bash kabuğu, çalışan herhangi bir programa/komut dosyasına 3 benzersiz dosya tanıtıcısı sunar:

  • STDOUT (1): standart çıkış, normal çıkışı saklar
  • STDERR (2): standart hata, hata mesajlarını saklar
  • STDIN (0): standart giriş

exec kullanarak, bu dosya tanıtıcılarını farklı bir konuma yönlendirebiliriz, örneğin: günlük dosyaları. Genel olarak hata ayıklama ve günlüğe kaydetme konusunda yardımcı olabilir.

Genel olarak, STDOUT ve STDERR'yi bir günlük dosyasına yönlendirmek istiyorsanız, yönlendirme operatörünü kullanırsınız:

$ Eko $$ | tişört test.log

$ keşiş 2 >& 1 | tişört test.log

Bu yöntem, günlüğe kaydetmek istediğiniz her noktada yeniden yönlendirme gerektirir. Bu sorunu çözmek için, kabuk oturumu için kalıcı bir yeniden yönlendirme oluşturmak üzere exec komutunu kullanabiliriz. Aşağıdaki örneği inceleyin:

#!/bin/bash

> test.log

yönetici 1 >> test.log

yönetici 2 >& 1

Eko 'Selam Dünya'

yanlış_komut

Burada ilk satır boş bir günlük dosyası oluşturur. İlk exec komutu, STDOUT'un günlük dosyasına kalıcı olarak yeniden yönlendirilmesini sağlar. İkinci exec komutu, STDERR'yi STDOUT'a yönlendirir.

Bu kurulumla, tüm çıktılar ve hata mesajları günlük dosyasına dökülür:

$. / test.sh

$ kedi test.log

Komut dosyası sürekli günlük girişleri oluşturuyorsa ne olur?

#!/bin/bash

> test.log

yönetici 1 >> test.log

yönetici 2 >& 1

sırasında doğru

Yapmak

Eko RASTGELE $

uyumak 5

Tamamlandı

Burada ilk kısımda STDOUT ve STDERR için log dosyamıza kalıcı bir yönlendirme oluşturuyoruz. Sonsuz while döngüsü, biz onu 'Ctrl + C' kullanarak zorla kapatana kadar yankı komutunu çalıştırır. $RANDOM değişkeni, her erişildiğinde rastgele bir dizi döndüren özel bir değişkendir.

Güncelleme günlüğü girişini kontrol etmek için aşağıdaki tail komutunu kullanın:

$ kuyruk -F test.log

Bu yeniden yönlendirmenin yalnızca kabuk oturumu için sürdüğünü unutmayın.

Örnek 4: Dosyadan Giriş

Kalıcı bir STDOUT ve STDERR yönlendirmesi oluşturduğumuza benzer şekilde, STDIN için de bir tane oluşturabiliriz. Bununla birlikte, giriş için STDIN kullanıldığından, uygulama biraz farklıdır.

Aşağıdaki betikte STDIN'i bir dosyadan alıyoruz:

#!/bin/bash

Eko 'Eko ' Selam Dünya '' > giriş

yönetici < giriş

Okumak satır 1

değerlendirmek $line_1

Burada, ilk satırda, yeniden yönlendirmeyi kullanarak input_string dosyasının içeriğini oluşturmak için yankı kullanıyoruz. exec komutu, input_string içeriğini geçerli kabuk oturumunun STDIN'sine yönlendirir. Dizeyi okuduktan sonra, $line_1 içeriğini bir kabuk kodu olarak değerlendirmek için eval'ı kullanırız.

Aşağıdaki betiği çalıştırın:

$ . / test.sh

Çözüm

Bash'teki exec komutu hakkında tartıştık. Ayrıca betiklerde kullanmanın çeşitli yollarını da gösterdik. Birden fazla kabukla çalışmak, belleği verimli betikler oluşturmak ve dosya tanıtıcılarını yeniden yönlendirmek için exec kullanmayı gösterdik.

Bu, Bash komut dosyası kullanılarak elde edilebileceklerin yalnızca küçük bir kısmıdır. Bash betikleri hakkında daha fazla bilgi edinin. Bash programlama alt kategori.

Mutlu bilgisayar!