Quais são os possíveis usos do comando exec?

Quais são os possíveis usos do comando exec?

Estou aprendendo execcomando. Eu sei que o execcomando substitui o processo que o iniciou. Portanto não é possível retornar ao processo que é substituído pelo execcomando.

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 execdisponí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 execcomando é 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 bashshell como

$ bash 

nele pstreeparece

├─terminal gnome
        ├─bash───bash───pstree

O bashshell anterior ainda está lá e você recebeu um novo bashshell. Considerando que se você abrir um novo shell bash como,

$ exec bash

os pstreeshows

├─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, vinã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.shque deseja ter um arquivo de log script.log, você pode usar execcomo,

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 execo comando que invoca o próximo estágio.

Veros usos do execcomando 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.wrapperscript vem com mate-terminal. Ele começa mate-terminalcom 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 execchamada 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, stderrpode ser redirecionado para arquivos usando exec.

  1. Redirecionamento stdout- exec 1>filefará com que a saída padrão seja um arquivo nomeado filepara o final da sessão atual do shell. Qualquer coisa a ser exibida no display estará no arquivo.

  2. Redirecionamento stdin- Também pode ser usado para redirecionar stdinpara um arquivo. Por exemplo, se você deseja executar um arquivo de script script.sh, basta redirecioná-lo stdinpara o arquivo usando exec 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).

informação relacionada