Que fait une commande "exec"?

59

Je ne comprends pas la commande bash exec . Je l'ai vu utilisé dans des scripts pour rediriger toutes les sorties vers un fichier (comme on le voit dans this ). Mais je ne comprends pas comment cela fonctionne ou ce qu'il fait en général. J'ai lu les pages de manuel mais je ne les comprends pas.

    
posée becko 18.09.2014 - 23:12
la source

4 réponses

50

man bash dit:

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.

Les deux dernières lignes sont ce qui est important: Si vous exécutez exec par lui-même, sans une commande, les redirections s’appliqueront simplement au shell actuel. Vous savez probablement que lorsque vous exécutez command > file , la sortie de command est écrite dans file au lieu de vers votre terminal (cela s'appelle une redirection ) . Si vous exécutez plutôt exec > file , la redirection s'applique à l'intégralité du shell: toute sortie produite par le shell est écrite dans file au lieu de dans votre terminal. Par exemple ici

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

Je commence d'abord un nouveau shell bash . Ensuite, dans ce nouveau shell, j'exécute exec > file , de sorte que toute sortie est redirigée vers file . En effet, après cela, je lance date mais je ne reçois aucune sortie, car la sortie est redirigée vers file . Puis je quitte mon shell (pour que la redirection ne soit plus appliquée) et je vois que file contient bien la sortie de la commande date que j'ai exécutée plus tôt.

    
réponse donnée fkraiem 18.09.2014 - 23:59
la source
23

Pour comprendre exec , vous devez d'abord comprendre fork . J'essaie de rester court.

  • Lorsque vous arrivez à une fourche dans la rue, vous avez généralement deux options. Les programmes Linux atteignent cette fourche lorsqu'ils rencontrent un Appel système fork() .

  • Les programmes normaux sont des commandes système qui existent sous une forme compilée sur votre système. Lorsqu'un tel programme est exécuté, un nouveau processus est créé. Ce processus enfant a le même environnement que son parent, seul le numéro d'identification du processus est différent. Cette procédure s'appelle forking .

  • Forking permet à un processus existant d'en démarrer un nouveau. cependant, il peut y avoir des situations où un processus enfant ne fait pas partie du même programme en tant que processus parent. Dans ce cas, exec est utilisé. exec remplacera le contenu du processus en cours par le informations d'un programme binaire.
  • Après le processus d’enregistrement, l’espace d’adresse du processus enfant est écrasé avec les nouvelles données de processus. Cela se fait par un exec appel au système.
réponse donnée g_p 18.09.2014 - 23:38
la source
21

exec est une commande avec deux comportements très distincts, selon que l'on utilise au moins un argument ou qu'aucun argument n'est utilisé.

  • Si au moins un argument est passé, le premier est pris comme nom de commande et exec essaie de l’exécuter en passant les arguments restants, le cas échéant, à cette commande et de gérer les redirections, le cas échéant.

  • Si la commande passée en premier argument n’existe pas, le shell en cours, et pas seulement la commande exec, se termine par erreur.

  • Si la commande existe et est exécutable, elle remplace le shell en cours. Cela signifie que si exec apparaît dans un script, les instructions qui suivent l'appel exec ne seront jamais exécutées (sauf si exec est lui-même dans un sous-shell). exec ne retourne jamais.

  • Si aucun argument n’est passé, exec est uniquement utilisé pour redéfinir les descripteurs de fichiers shell actuels. Le shell continue après le exec , contrairement au cas précédent, mais l'entrée, la sortie, l'erreur ou le descripteur de fichier standard a été redirigé.

  • Si certaines des redirections utilisent /dev/null , toute entrée retournera EOF et toute sortie sera rejetée.

  • Vous pouvez fermer les descripteurs de fichier en utilisant - comme source ou destination, par ex. exec <&- . Les lectures ou écritures ultérieures échoueront alors.

Voici deux exemples:

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

Ce script va afficher "foo" en tant que commande cat, au lieu d’attendre que l’utilisateur entre les données comme il l’aurait fait dans le cas habituel, il entrera dans le fichier / tmp / bar qui contient foo.

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

Ce script affiche 4 (le nombre d’octets dans / tmp / bar) et se termine immédiatement. La commande cat ne sera pas exécutée.

    
réponse donnée jlliagre 19.09.2014 - 00:02
la source
4

Dans bash , si vous faites 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.

Le bit pertinent:

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

exec est un shell intégré , qui est l’équivalent du shell de la famille exec de < a href="http://manpages.ubuntu.com/manpages/trusty/en/man3/exec.3.html"> appels système qui G_P parle de (et des pages de manuel que vous semblez avoir lues). Il suffit d’avoir la fonctionnalité POSIX pour affecter le shell actuel si aucune commande spécifié.

    
réponse donnée muru 18.09.2014 - 23:52
la source

Lire d'autres questions sur les étiquettes