No script de wrapper
exec
é usado principalmente em scripts de wrapper.
Se você quiser modificar o ambiente de um programa antes de executar o programa principal, você frequentemente escreverá um script e, no final, iniciará o programa principal. Mas não há necessidade de o script permanecer na memória naquele momento. Portanto, exec
é usado nesses casos para que o programa principal possa substituir o script-mãe.
Aqui está um exemplo prático disso. É mate-terminal.wrapper
script vem com terminal de mate. Ele inicia o mate-terminal
com alguns argumentos extras verificando os ambientes do usuário.
#!/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);
O ponto a ser observado aqui é que há uma chamada exec
, que substitui esse script na memória.
Aqui está uma pergunta semelhante respondida no Unix & Site do Linux StackExchange - link
Para redirecionar descritores de arquivos
Outro uso comum de exec
é o redirecionamento de descritores de arquivos. stdin
, stdout
, stderr
pode ser redirecionado para arquivos usando exec.
-
Redirecionar
stdout
-exec 1>file
fará com que a saída padrão seja um arquivo chamadofile
para o final da sessão atual do shell. Qualquer coisa para a saída para a exibição estará no arquivo. -
Redirecionando
stdin
- Também pode ser usado para redirecionar ostdin
para um arquivo. Por exemplo, se você quiser executar um arquivo de scriptscript.sh
, basta redirecionar ostdin
para o arquivo usandoexec 0<script.sh
.