Я учусь exec
команда. Я знаю что exec
управляйте заменяет процесс, который запустил его. Таким образом, это не возможно возвратить к процессу, который заменяется exec
команда.
Можно было сказать, что это - цель, должен лишить возможности возвращаться к процессу, который запустил его.
Но что является другим использованием для того, чтобы иметь что-то как exec
доступный как команда?
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
может быть перенаправлен в файлы с помощью должностного лица.
Перенаправление stdout
- exec 1>file
заставит стандартный вывод быть названным файлом file
для конца текущей сессии оболочки. Что-либо для вывода к дисплею будет в файле.
Перенаправление stdin
- Это может также использоваться для перенаправления stdin
в файл. Например, Если Вы хотите выполнить файл сценария script.sh
, можно просто перенаправить stdin
к использованию файла exec 0<script.sh
.
Насколько я знаю, что это также используется для перенаправления дескрипторов файлов (например, STDOUT, STDERR, STDIN) сценария удара.
Так, например, Вы могли читать из файла вместо этого с клавиатуры при помощи перенаправления STDIN и записать в файл вместо терминала STDOUT (или мог быть STDERR в зависимости от программы), перенаправление.
exec
управляйте заменяет текущий процесс оболочки указанной командой. Обычно при выполнении команды, новый процесс порожден (разветвленный). exec
команда не порождает новый процесс. Вместо этого текущий процесс наложен с новой командой. Другими словами, exec
команда выполняется вместо текущей оболочки, не создавая новый процесс.
Существует три наиболее популярных способа использования исполнительной команды:
Пример 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, терминал также закрывается.
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
Можно также использовать исполнительную команду для создания ряда сценариев оболочки, которые выполняют друг друга последовательно как этапы процесса. Вместо того, чтобы породить новые процессы каждый раз, когда необходимо передать управление следующему сценарию, Вы выполняете исполнительную команду.
В этом случае последний оператор каждого этапа должен быть exec
команда, которая вызывает следующий этап.
Посмотрите использование exec
команда в сценариях оболочки для больше.
Примечание: Участие вышеупомянутого принято от этого.