Estou aprendendo exec
comando. Eu sei que o exec
comando substitui o processo que o iniciou. Portanto não é possível retornar ao processo que é substituído pelo exec
comando.
Poderíamos dizer que seu objetivo é impossibilitar o retorno ao processo que o iniciou.
Mas quais são os outros usos para ter algo parecido exec
disponível como um comando?
Responder1
O exec
comando substitui o processo shell atual pelo comando especificado. Normalmente, quando você executa um comando, um novo processo é gerado (bifurcado). O exec
comando não gera um novo processo. Em vez disso, o processo atual é sobreposto ao novo comando. Em outras palavras, o exec
comando é executado no lugar do shell atual sem criar um novo processo.
Existem três usos mais comuns do comando exec:
1. Substituição de processo
Exemplo 1:
Se você abrir um novo bash
shell como
$ bash
nele pstree
parece
├─terminal gnome ├─bash───bash───pstree
O bash
shell anterior ainda está lá e você recebeu um novo bash
shell. Considerando que se você abrir um novo shell bash como,
$ exec bash
os pstree
shows
├─terminal gnome ├─bash───pstree
Aqui o antigo bash
é substituído pelo novo. É particularmente útil sair de vários logins em um comando.É mais seguro e elimina a chance de deixar um terminal aberto por engano.VerSaia do root e do usuário com um comando
Exemplo-2:você pode abrir um arquivo como
$ exec vi filename.txt
Ao sair, vi
não há necessidade de fechar o terminal separadamente, pois o shell já foi substituído. Assim que você fecha o vi, o terminal também é fechado.
2. Um método de redirecionamento de descritores de arquivo dentro dos scripts de shell
O exec
comando também pode ser usado em scripts de shell para abrir, fechar e copiar descritores de arquivo dinamicamente. Isso permite realizar o redirecionamento de STDIN, STDERR, STDOUT e outros descritores de arquivo para vários arquivos dentro do shell script, em vez da string de invocação de comando. Se você não especificar um comando ou argumentos, poderá especificar símbolos de redirecionamento e descritores de arquivo para executar essas funções.
Digamos que você tenha um script de shell script.sh
que deseja ter um arquivo de log script.log
, você pode usar exec
como,
LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1
o que equivale a
./script &>> /path/to/script.log
./script >> /path/to/script.log 2>&1
3. Criando etapas do processo usando o comando exec
Você também pode usar o comando exec para criar um conjunto de scripts de shell que executam uns aos outros sequencialmente, como estágios do processo. Em vez de gerar novos processos cada vez que precisar transferir o controle para o próximo script, execute o comando exec.
Neste caso a última instrução de cada estágio deverá ser exec
o comando que invoca o próximo estágio.
Veros usos do exec
comando em scripts shellpara mais.
Observação:Parte do acima foi retirado deesse.
Responder2
No script wrapper
exec
é usado principalmente em scripts wrapper.
Se você quiser modificar o ambiente de um programa antes de executar o programa principal, geralmente escreveria um script e, no final, iniciaria o programa principal. Mas não há necessidade do script ficar na memória naquele momento. Então, exec
é utilizado nestes casos para que o programa principal possa substituir o script mãe.
Aqui está um exemplo prático disso. Seu mate-terminal.wrapper
script vem com mate-terminal. Ele começa 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 exec
chamada que substitui esse script na memória.
Aqui está uma pergunta semelhante respondida no site Unix e Linux StackExchange -https://unix.stackexchange.com/q/270929/19288
Para redirecionar descritores de arquivos
Outro uso comum exec
é no redirecionamento de descritores de arquivos. stdin
, stdout
, stderr
pode ser redirecionado para arquivos usando exec.
Redirecionamento
stdout
-exec 1>file
fará com que a saída padrão seja um arquivo nomeadofile
para o final da sessão atual do shell. Qualquer coisa a ser exibida no display estará no arquivo.Redirecionamento
stdin
- Também pode ser usado para redirecionarstdin
para um arquivo. Por exemplo, se você deseja executar um arquivo de scriptscript.sh
, basta redirecioná-lostdin
para o arquivo usandoexec 0<script.sh
.
Responder3
Pelo que eu sei, também é usado para redirecionar descritores de arquivos (por exemplo, STDOUT, STDERR, STDIN) de um script bash.
Por exemplo, você pode ler um arquivo em vez do teclado usando o redirecionamento STDIN e gravar em um arquivo em vez do terminal por meio do redirecionamento STDOUT (ou pode ser STDERR dependendo do programa).