O que faz um comando “exec”?

53

Eu não entendo o comando bash exec . Eu vi isso usado dentro de scripts para redirecionar toda a saída para um arquivo (como visto em isto ). Mas não entendo como funciona ou o que faz em geral. Eu li as man pages mas não as compreendo.

    
por becko 18.09.2014 / 23:12

4 respostas

46

man bash diz:

exec [-cl] [-a name] [command [arguments]]
      If command is specified, it replaces the shell.  No new  process
      is  created.  The arguments become the arguments to command.  If
      the -l option is supplied,  the  shell  places  a  dash  at  the
      beginning  of  the  zeroth  argument passed to command.  This is
      what login(1) does.  The -c option causes command to be executed
      with  an empty environment.  If -a is supplied, the shell passes
      name as the zeroth argument to the executed command.  If command
      cannot  be  executed  for  some  reason, a non-interactive shell
      exits, unless the execfail shell option  is  enabled.   In  that
      case,  it returns failure.  An interactive shell returns failure
      if the file cannot be executed.  If command  is  not  specified,
      any  redirections  take  effect  in  the  current shell, and the
      return status is 0.  If there is a redirection error, the return
      status is 1.

As duas últimas linhas são importantes: se você executar exec sozinho, sem um comando, ele simplesmente fará com que os redirecionamentos se apliquem ao shell atual. Você provavelmente sabe que quando você executa command > file , a saída de command é gravada em file em vez de no seu terminal (isso é chamado de redirecionamento ). Se você executar exec > file , o redirecionamento será aplicado ao shell inteiro: Qualquer saída produzida pelo shell será gravada em file em vez de no seu terminal. Por exemplo aqui

bash-3.2$ bash
bash-3.2$ exec > file
bash-3.2$ date
bash-3.2$ exit
bash-3.2$ cat file
Thu 18 Sep 2014 23:56:25 CEST

Primeiramente, inicio um novo shell bash . Então, neste novo shell eu corro exec > file , de modo que toda saída seja redirecionada para file . De fato, depois disso eu corro date mas não recebo saída, porque a saída é redirecionada para file . Em seguida, saio do shell (para que o redirecionamento não se aplique mais) e vejo que file contém a saída do comando date que executei anteriormente.

    
por fkraiem 18.09.2014 / 23:59
22

Para entender exec , primeiro você precisa entender fork . Eu estou tentando manter isso curto.

  • Quando você chega a uma bifurcação na estrada, você geralmente tem duas opções. Os programas do Linux alcançam essa bifurcação quando atingem um fork() chamada do sistema.

  • Programas normais são comandos do sistema que existem em um formulário compilado em Seu sistema. Quando tal programa é executado, um novo processo é criada. Esse processo filho tem o mesmo ambiente que seu pai, apenas o número de identificação do processo é diferente. Este procedimento é chamado bifurcando .

  • O bifurcação fornece uma maneira para um processo existente iniciar um novo. Contudo, pode haver situações em que um processo filho não é a parte do mesmo programa como processo pai. Nesse caso, exec é usado. %código% substituirá o conteúdo do processo atualmente em execução pelo informações de um programa binário.
  • Após o processo de bifurcação, o espaço de endereço do processo filho é sobrescritos com os novos dados do processo. Isso é feito através de um exec chamada para o sistema.
por g_p 18.09.2014 / 23:38
18

exec é um comando com dois comportamentos muito distintos, dependendo de se pelo menos um argumento é usado ou nenhum argumento é usado.

  • Se pelo menos um argumento for passado, o primeiro é considerado como um nome de comando e exec tentará executá-lo como um comando passando os argumentos restantes, se houver, para esse comando e gerenciando os redirecionamentos, se houver.

  • Se o comando passado como primeiro argumento não existir, o shell atual, não apenas o comando exec, sai com erro.

  • Se o comando existir e for executável, ele substituirá o shell atual. Isso significa que se exec aparecer em um script, as instruções após a chamada exec nunca serão executadas (a menos que exec esteja em uma sub-rede). exec nunca retorna.

  • Se nenhum argumento for passado, exec será usado apenas para redefinir os descritores de arquivo de shell atuais. O shell continua após o exec , diferentemente do caso anterior, mas a entrada, a saída, o erro ou qualquer descritor de arquivo padrão foi redirecionado.

  • Se alguns dos redirecionamentos usar /dev/null , qualquer entrada retornará EOF e qualquer saída será descartada.

  • Você pode fechar os descritores de arquivo usando - como origem ou destino, por exemplo, %código%. As leituras ou gravações subsequentes falharão.

Aqui estão dois exemplos:

echo foo > /tmp/bar
exec < /tmp/bar # exec has no arguments, will only affect current shell descriptors, here stdin
cat # simple command that read stdin and write it to stdout

Este script produzirá "foo" como o comando cat, em vez de aguardar a entrada do usuário como faria no caso usual, receberá sua entrada do arquivo / tmp / bar que contém foo.

echo foo > /tmp/bar
exec wc -c < /tmp/bar # exec has two arguments, the control flow will switch to the wc command
cat

Este script exibirá exec <&- (o número de bytes em / tmp / bar) e terminará imediatamente. O comando 4 não será executado.

    
por jlliagre 19.09.2014 / 00:02
3

Em bash , se você usa help exec :

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.

    Options:
      -a name   pass NAME as the zeroth argument to COMMAND
      -c        execute COMMAND with an empty environment
      -l        place a dash in the zeroth argument to COMMAND

    If the command cannot be executed, a non-interactive shell exits, unless
    the shell option 'execfail' is set.

    Exit Status:
    Returns success unless COMMAND is not found or a redirection error occurs.

O bit relevante:

If COMMAND is not specified, any redirections take effect in the current shell.

exec é um shell embutido , que é o equivalente de shell da família exec de < as chamadas de sistema que G_P fala de (e de quais manpages você parece ter lido). Ele só tem a funcionalidade POSIX obrigada de afetar o shell atual se nenhum comando for especificado.

    
por muru 18.09.2014 / 23:52

Tags