Что такое использование команды exec?

9

Я изучаю команду exec . Я знаю, что команда exec заменяет процесс, который ее запустил. Таким образом, невозможно вернуться к процессу, который заменяется командой exec .

Можно сказать, что цель - сделать невозможным возвращение к процессу, который его начал.

Но каковы другие применения для использования в качестве команды что-то вроде exec ?

    
задан mizech 02.09.2016 в 06:58
источник

3 ответа

9

В сценарии оболочки

exec используется главным образом в сценариях оболочки.

Если вы хотите изменить среду для программы перед выполнением основной программы, вы часто пишете скрипт и в конце запускаете основную программу. Но нет необходимости, чтобы сценарий оставался в памяти в то время. Таким образом, exec используется в этих случаях, так что основная программа может заменить матовый скрипт.

Вот практический пример. Скрипт mate-terminal.wrapper поставляется с mate-terminal. Он запускает mate-terminal с некоторыми дополнительными аргументами, проверяя среду пользователя.

#!/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);

Обратите внимание на то, что есть вызов exec , который заменяет этот скрипт в памяти.

Вот аналогичный вопрос, заданный в Unix & amp; Linux StackExchange Site - Ссылка

Чтобы перенаправить файловые дескрипторы

Другим распространенным использованием exec является перенаправление файловых дескрипторов. stdin , stdout , stderr могут быть перенаправлены на файлы с помощью exec.

  1. Перенаправление stdout - exec 1>file приведет к тому, что стандартный вывод будет файлом с именем file для конца текущего сеанса оболочки. Все, что выводится на дисплей, будет в файле.

  2. Перенаправление stdin - его также можно использовать для перенаправления stdin в файл. Например, если вы хотите выполнить файл сценария script.sh , вы можете просто перенаправить stdin в файл, используя exec 0<script.sh .

ответ дан Anwar 02.09.2016 в 08:59
источник
8

Команда exec заменяет текущий процесс оболочки указанной командой. Обычно, когда вы запускаете команду, создается новый процесс (раздвоенный). Команда exec не порождает новый процесс. Вместо этого текущий процесс накладывается на новую команду. Другими словами, команда exec выполняется вместо текущей оболочки без создания нового процесса.

Существует три наиболее распространенных способа использования команды exec:

1. Замена процесса

Пример-1: Если вы открываете новую оболочку bash как

$ bash 

в pstree похоже на

├─gnome-terminal
        ├─bash───bash───pstree

Предыдущий bash shell все еще существует, и вы получили новую оболочку bash . Если вы открываете новую оболочку bash как

$ exec bash

pstree показывает

├─gnome-terminal
        ├─bash───pstree

Здесь старый bash заменяется на новый. Особенно полезно выйти из нескольких логинов в одной команде. Это более безопасно и устраняет вероятность выхода из открытого терминала по ошибке. См. Выход из корня и пользователя с помощью одной команды

Пример-2: вы можете открыть файл как

$ exec vi filename.txt

Когда вы выходите из vi , нет необходимости закрывать терминал отдельно, поскольку оболочка уже заменена. Как только вы закроете vi, терминал также будет закрыт.

2. Метод перенаправления файловых дескрипторов в сценариях оболочки

Команда exec также может использоваться в сценариях оболочки, динамически открывать, закрывать и копировать файловые дескрипторы. Это позволяет выполнять перенаправление STDIN, STDERR, STDOUT и других файловых дескрипторов на различные файлы внутри сценария оболочки вместо строки вызова команды. Если вы не укажете команду или аргументы, вы можете указать символы перенаправления и файловые дескрипторы для выполнения этих функций.

Скажем, у вас есть сценарий оболочки script.sh , который вы хотите иметь файл журнала script.log , вы можете использовать exec as,

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

, что эквивалентно

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

3. Создание этапов процесса с помощью команды exec

Вы также можете использовать команду exec для создания набора сценариев оболочки, которые последовательно выполняют одно из шагов, подобных этапам процесса. Вместо того, чтобы создавать новые процессы каждый раз, когда вам нужно передать управление на следующий скрипт, вы выполняете команду exec.

В этом случае последним оператором каждого этапа должна быть команда exec , которая вызывает следующий этап.

См. использование exec в сценариях оболочки для более подробной информации.

Примечание. Часть выше взята из этого .

    
ответ дан souravc 02.09.2016 в 09:25
2

Насколько я знаю, он также используется для перенаправления файловых дескрипторов (например, STDOUT, STDERR, STDIN) сценария bash.

Так, например, вы можете читать из файла вместо этого с клавиатуры, используя перенаправление STDIN и запись в файл вместо терминала с помощью STDOUT (или может быть STDERR в зависимости от программы) перенаправления.     

ответ дан Levin Palm 02.09.2016 в 07:47