Quais são as possibilidades de uso do comando exec?

9

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

Pode-se dizer que o propósito é impossibilitar o retorno ao processo que o iniciou.

Mas, quais são os outros usos para ter algo como exec disponível como um comando?

    
por mizech 02.09.2016 / 08:58

3 respostas

9

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.

  1. Redirecionar stdout - exec 1>file fará com que a saída padrão seja um arquivo chamado file para o final da sessão atual do shell. Qualquer coisa para a saída para a exibição estará no arquivo.

  2. Redirecionando stdin - Também pode ser usado para redirecionar o stdin para um arquivo. Por exemplo, se você quiser executar um arquivo de script script.sh , basta redirecionar o stdin para o arquivo usando exec 0<script.sh .

por Anwar 02.09.2016 / 10:59
8

O comando exec substitui o processo atual do shell pelo comando especificado. Normalmente, quando você executa um comando, um novo processo é gerado (bifurcado). O comando exec não gera um novo processo. Em vez disso, o processo atual é sobreposto com o novo comando. Em outras palavras, o comando exec é executado no lugar do shell atual sem criar um novo processo.

Existem três usos mais comuns do comando exec:

1. Substituição do processo

Exemplo-1: Se você abrir um novo bash shell como

$ bash 

em pstree parece

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

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

$ exec bash

o pstree mostra

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

Aqui, o antigo bash é substituído por um novo. É particularmente útil para sair de vários login em um comando. É mais seguro e erradica a chance de deixar um terminal aberto por engano. Veja Sai da raiz e do usuário com um comando

Exemplo-2: você pode abrir um arquivo como

$ exec vi filename.txt

Quando você sair do vi , não há necessidade de fechar o terminal separadamente, pois o shell já foi substituído. Assim que você fechar o vi o terminal também estará fechado.

2. Um método de redirecionamento de descritores de arquivos dentro dos scripts de shell

O comando exec também pode ser usado em scripts shell, abrindo, fechando e copiando descritores de arquivos. Isso permite executar o redirecionamento de STDIN, STDERR, STDOUT e outros descritores de arquivos para vários arquivos dentro do script de shell, em vez da sequência de chamada de comando. Se você não especificar um comando ou argumentos, poderá especificar símbolos de redirecionamento e descritores de arquivos para executar essas funções.

Digamos que você tenha um script de shell script.sh para ter um arquivo de log script.log , você pode usar exec as,

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

que é equivalente a

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. Criando estágios do processo usando o comando exec

Você também pode usar o comando exec para criar um conjunto de scripts de shell que executam um ao outro sequencialmente, como os estágios do processo. Em vez de gerar novos processos toda vez que você precisar transferir o controle para o próximo script, execute o comando exec.

Nesse caso, a última declaração de cada estágio deve ser o comando exec , que invoca o próximo estágio.

Veja os usos do exec comando em scripts de shell para mais.

Observação: A parte acima foi tirada de isto

    
por souravc 02.09.2016 / 11:25
2

Tanto quanto eu sei, ele também é usado para redirecionar descritores de arquivo (por exemplo, STDOUT, STDERR, STDIN) de um script bash.

Assim, por exemplo, você poderia ler de um arquivo em vez do teclado usando o redirecionamento STDIN e gravar em um arquivo em vez do terminal pelo redirecionamento STDOUT (ou poderia ser STDERR dependendo do programa).

    
por Levin Palm 02.09.2016 / 09:47