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

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

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

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

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 - https://unix.stackexchange.com/q/270929/19288

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

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

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

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

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

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

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

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

$ bash 

в pstree это выглядит как

├─gnome-терминал
        ├─bash───bash───pstree

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

$ exec bash

pstree шоу

├─gnome-терминал
        ├─bash───pstree

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

Пример 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 для создания набора сценариев оболочки, которые выполняются друг за другом последовательно, как этапы процесса. Вместо того, чтобы порождать новые процессы каждый раз, когда вам нужно передать управление следующему сценарию, вы выполняете команду exec.

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

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

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

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

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

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