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