Exec komutunun olası kullanımı nelerdir?


10

Ben execkomuta öğreniyorum . execKomutun, başlatan işlemin yerini aldığını biliyorum . Böylece execkomutla değiştirilen işleme geri dönmek mümkün değildir .

Bunun amacının, onu başlatan sürece geri dönmeyi imkansız kılmak olduğunu söyleyebiliriz.

Peki execkomut gibi kullanılabilir bir şey elde etmenin diğer kullanımları nelerdir?



1
wikipedia makalesinden: "Sarmalayıcı komut dosyaları, ortam değişkenlerini veya diğer yapılandırmaları ayarladıktan sonra bir programı (doğrudan veya bir yorumlayıcı veya sanal makine aracılığıyla) çalıştırmak için genellikle bu komutu kullanır."
knb


2
Şahsen, exec ssh server-that-does-byobu-on-login.example.comçok hoş buluyorum , çünkü ^ A ^ D terminali tamamen kapatıyor. (Daha genel olarak, exec byobu(veya exec screen, exec tmux).
Williham Totland

Yanıtlar:


9

Sarıcı komut dosyasında

exec temel olarak sarıcı komut dosyalarında kullanılır.

Ana programı yürütmeden önce bir programın ortamını değiştirmek isterseniz, genellikle bir komut dosyası yazarsınız ve sonunda ana programı başlatırsınız. Ancak senaryonun o sırada hafızada kalmasına gerek yoktur. Yani, execbu durumlarda kullanılır, böylece ana program ana komut dosyasının yerini alabilir.

İşte bunun pratik bir örneği. It adlı mate-terminal.wrapperkomut arkadaşı-terminali ile gelir. mate-terminalKullanıcının ortamlarını kontrol ederek bazı ekstra argümanlarla başlar .

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

Burada dikkat edilmesi gereken nokta exec, hafızadaki bu komut dosyasının yerini alan bir çağrı var .

İşte Unix ve Linux StackExchange Sitesinde benzer bir soru - https://unix.stackexchange.com/q/270929/19288

Dosya tanımlayıcıları yeniden yönlendirmek için

Diğer bir yaygın kullanımı execdosya tanımlayıcıları yeniden yönlendirmektir. stdin, stdout, stderrExec dosyalara yönlendirilebilir.

  1. Yönlendirme stdout- exec 1>filestandart çıktının filegeçerli kabuk oturumunun sonu için adlandırılmış bir dosya olmasına neden olur . Ekrana çıkarılacak her şey dosyada olacaktır.

  2. Yönlendirme stdin- stdinDosyayı yeniden yönlendirmek için de kullanılabilir . Örneğin, bir komut dosyası yürütmek istiyorsanız script.sh, stdindüğmesini kullanarak dosyayı yeniden yönlendirebilirsiniz exec 0<script.sh.


Tamam. Daha sonra 'mate-terminal' sarmalayıcı komut dosyasının sahip olduğu PID'ye sahip olacak mı? Ve wrapper-script'in kullandığı belleği kullanacak mı? Böylece sarıcı komut dosyası kayboldu. Aksi takdirde, iki komut dosyası sistemde ayrı işlemler olarak var olur (iki farklı PID ile)?
mizech

@mizech evet. Aynı PID'yi kullanıyorlar
Anwar 9

@mizech Yardım ettiğine sevindim :)
Anwar

1
Mükemmel bir örnek, bu gerçekten net
Zanna

Bu yanıt kısmi ve önemli (ve tipik) kullanımlarından birini özlüyor exec, dosya tanımlayıcılarının yeniden yönlendirilmesinde kullanılması.
heemayl

9

exec Komut, belirlenen komutu ile geçerli kabuk işlemi yerine geçer. Normalde, bir komutu çalıştırdığınızda yeni bir süreç ortaya çıkar (çatallanır). exec Komut yeni bir süreç yumurtlamaya etmez. Bunun yerine, geçerli işlem yeni komutla kaplanır. Başka bir deyişle, execkomut yeni bir işlem oluşturmadan geçerli kabuk yerine yürütülür.

Exec komutunun en yaygın üç kullanımı vardır:

1. Sürecin değiştirilmesi

Örnek-1: Yeni birbashkabukaçarsanız

$ bash 

içinde pstreebenziyor

├─gnome-terminali
        ├─bash───bash───pstree

Önceki bashmermi hala orada ve yeni bir bashmermi var. Halbuki yeni bir bash kabuğu açarsanız,

$ exec bash

pstreegösterileri

├─gnome-terminali
        ├─bash───pstree

Burada eskisinin bashyerine yenisi gelir. Tek bir komutta çoklu girişten çıkmak özellikle yararlıdır. Daha güvenlidir ve yanlışlıkla açık bir terminalden ayrılma şansını ortadan kaldırır. Bkz. Tek komutla hem kökten hem de kullanıcıdan çıkma

Örnek-2: Bir dosyayı şu şekilde açabilirsiniz :

$ exec vi filename.txt

Çıktığınızda vi, kabuk zaten değiştirildiği için terminali ayrı olarak kapatmaya gerek yoktur. Vi'yi kapatır kapatmaz terminal de kapanır.

2. Kabuk komut dosyalarındaki dosya tanımlayıcılarını yeniden yönlendirme yöntemi

exec Komut ayrıca yakın, kabuk komut dinamik olarak açık kullanılabilir ve dosya tanımlayıcıları kopya edilebilir. Bu, STDIN, STDERR, STDOUT ve diğer dosya tanımlayıcılarının komut çağırma dizesi yerine kabuk betiğinin içindeki çeşitli dosyalara yeniden yönlendirilmesini sağlar. Bir komut veya bağımsız değişken belirtmezseniz, bu işlevleri gerçekleştirmek için yeniden yönlendirme simgeleri ve dosya tanımlayıcıları belirtebilirsiniz.

Eğer bir kabuk olduğunu varsayalım script.shEğer bir günlük dosyası olmasını istiyorsanız script.log, kullanabileceğiniz execgibi

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

eşdeğer

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. exec komutunu kullanarak sürecin aşamalarını oluşturma

Ayrıca, işlemin aşamaları gibi sırayla birbirini yürüten bir dizi kabuk komut dosyası oluşturmak için exec komutunu da kullanabilirsiniz. Her seferinde denetimi bir sonraki komut dosyasına aktarmanız gerektiğinde yeni işlemler oluşturmak yerine exec komutunu çalıştırırsınız.

Bu durumda, her aşamanın son ifadesi exec, bir sonraki aşamayı çağıran komut olmalıdır .

Daha fazla bilgi için kabuk komut dosyalarında komutun kullanımlarınaexec bakın .

Not: Yukarıdakilerin bir kısmı bundan alınır .


1
Sadece tam cevap (şimdiye kadar).
heemayl

Ben exec kullandığım her zaman verimlilik için olmuştur. Exec ile bir arka plan programı çalıştırırsanız, iki yerine yalnızca bir etkin işleme sahip olmanız gerekir. Bash sürecini terk etmek, diğer şeylerin yanı sıra birkaç MB koç harcar.
gmatht

2

Bildiğim kadarıyla bir bash betiğinin dosya tanımlayıcılarını (örneğin, STDOUT, STDERR, STDIN) yönlendirmek için de kullanılır.

Örneğin, STDIN yeniden yönlendirmesini kullanarak klavyeden bir dosyadan okuyabilir ve STDOUT (veya programa bağlı olarak STDERR olabilir) ile terminal yerine bir dosyaya yazabilirsiniz.


1
Bu cevap kısmi ve sadece bu cevabı tamamlıyor .
heemayl
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.