O que faz 'exec' $ @ ''?

0

Eu tenho visto isso em muitos docker-entrypoint.sh scripts recentemente, e não consigo encontrar uma explicação online. Meus primeiros pensamentos são de que isso tem a ver com sinalização, mas é um palpite bem selvagem.

    
por John Von Neumann 05.09.2018 / 14:14

3 respostas

1

O bit "$@" expandirá para a lista de parâmetros posicionais (geralmente os argumentos da linha de comando), citados individualmente para evitar a divisão de palavras e geração de nome de arquivo ("globbing").

O exec substituirá o processo atual pelo processo resultante da execução de seu argumento.

Em suma, exec "$@" executará o comando dado pelos parâmetros da linha de comando de tal forma que o processo atual seja substituído por ele (se o exec for capaz de executar o comando).

    
por 05.09.2018 / 14:21
3

Dois outras respostas explicam o que o exec "$@" faz. Esta resposta no Stack Overflow explica porque é importante para o Docker e, como você supõe, tem a ver com sinais:

This is important in Docker for signals to be proxied correctly. For example, if Redis was started without exec, it will not receive a SIGTERM upon docker stop and will not get a chance to shutdown cleanly. In some cases, this can lead to data loss or zombie processes.

If you do start child processes (i.e. don't use exec), the parent process becomes responsible for handling and forwarding signals as appropriate. This is one of the reasons it's best to use supervisord or similar when running multiple processes in a container, as it will forward signals appropriately.

    
por 05.09.2018 / 18:16
1

"$@" em shells do tipo Bourne, em contextos de lista expande para todos os parâmetros posicionais como argumentos separados.

Em um script, inicialmente, os parâmetros posicionais são os argumentos que o próprio script recebeu.

exec é executar um comando no mesmo processo que o shell. Esse é o último comando que um script executará, porque depois disso, o processo estará executando outro comando que o shell.

Então, se o seu script é

#! /bin/sh -
exec "$@"

E você chama seu script usando uma linha de comando shell como:

/path/to/your-script 'echo' "some  test" 'x y'

Ele chamará exec com echo , some test e x y como argumentos que executarão echo (na maioria das implementações de sh , /bin/echo em oposição ao shell echo embutido ) no mesmo processo que estava executando o shell interpretando seu script com some test e x y como argumentos.

    
por 05.09.2018 / 14:21