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

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

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

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

10
задан 2 September 2016 в 02:41

3 ответа

В сценарии обертки

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

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

Вот практический пример его. Это mate-terminal.wrapper сценарий идет с терминалом помощника. Это запускается 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 & Linux StackExchange Site - https://unix.stackexchange.com/q/270929/19288

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

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

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

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

9
ответ дан 23 November 2019 в 04:23

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

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

2
ответ дан 23 November 2019 в 04:23

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

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

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

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

$ bash 

в pstree это похоже

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

Предыдущее 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 как,

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 команда в сценариях оболочки для больше.

Примечание: Участие вышеупомянутого принято от этого.

8
ответ дан 23 November 2019 в 04:23

Другие вопросы по тегам:

Похожие вопросы: