Usos de l'ordre Exec als scripts de Shell

Usos De L Ordre Exec Als Scripts De Shell



Aquesta guia explica l'ordre exec i el seu ús als scripts de shell.

Requisits previs:

Per dur a terme els passos que es mostren en aquesta guia, necessiteu els components següents:

  • Un sistema Linux funcional. Aprendre mes sobre configurar una màquina virtual d'Ubuntu amb VirtualBox .
  • Accés a a usuari no root amb privilegi sudo .
  • Un editor de text adequat. Per exemple: Per què / NeoVim , Nano , Text sublim , VSCodium , etc.

El comandament executiu

L'ordre exec no és una eina separada per si mateixa:







$ quin executiu



Més aviat, és una ordre interna de l'intèrpret d'ordres Bash:



$ home executiu





Tal com suggereix la descripció de la pàgina de manual, si s'especifica una ordre, exec substitueix l'intèrpret d'ordres per ella, sense generar cap procés addicional. Hi ha un grapat d'opcions disponibles que modifiquen el comportament de l'ordre exec.



Ús bàsic

Per defecte, sempre que s'executa una ordre, Bash genera una subshell i bifurca l'ordre.

$ eco $$ && dormir 999

$ pstree -p

Aquí, l'ordre echo imprimeix el PID de l'intèrpret d'ordres actual. L'intèrpret d'ordres Bash (PID: 978) genera un nou procés fill per treballar amb l'ordre sleep (PID: 8369).

Ara, què passa si executem l'ordre sleep mitjançant exec?

$ eco $$ && executiu dormir 999

$ pstree -p

El procés pare Bash se substitueix per l'ordre sleep. Un cop s'executa correctament, no torna a l'intèrpret d'ordres. En canvi, la sessió s'acaba.

Entorn net

La configuració predeterminada de Bash inclou un munt de retocs i variables d'entorn. En determinats escenaris (depuració, per exemple), és possible que vulgueu executar el vostre script/programa en un entorn net. Amb l'ajuda de l'executiu, podem llançar una instància de shell neta en lloc de l'actual.

Primer, utilitzeu l'ordre printenv per llistar totes les variables d'entorn que estan configurades actualment:

$ imprimirv

Ara, utilitzeu exec per llançar una instància neta:

$ executiu -c xoc

$ printenv

Llançament d'un Shell diferent

A més de Bash i 'sh', hi ha diversos altres programes shell disponibles, cadascun amb els seus avantatges únics. Si un programa/script requereix un intèrpret d'ordres específic, podeu utilitzar exec per substituir l'intèrpret d'ordres Bash actual per el desitjat.

En l'exemple següent, substituïm Bash per 'sh':

$ pstree -p

$ executiu sh

$ pstree -p

Utilitzant Exec als scripts

Amb els conceptes bàsics fora del camí, ara podem començar a utilitzar exec als nostres scripts de shell.

Exemple 1: treballant amb diferents petxines

Consulteu el següent script:

#!/bin/bash

eco $SHELL

eco 'Echo zsh s'ha llançat correctament' > zsh.sh

executiu zsh zsh.sh

Aquí, la primera ordre d'eco imprimeix l'intèrpret d'ordres actual. Per defecte, hauria de ser Bash. Aleshores, l'ordre exec llança 'zsh' per executar l'script 'zsh.sh'.

Executeu l'script següent:

$ . / test.sh

Exemple 2: anul·lació del procés existent

Sempre que crida a una ordre/programa, Bash genera un nou procés. En la majoria de situacions, no és una qüestió de preocupació. Tanmateix, quan es treballa amb un sistema amb recursos molt limitats (maquinari incrustat, per exemple), utilitzar exec per anul·lar el procés existent a la memòria pot ajudar.

Consulteu el següent script:

#!/bin/bash

pstree -p

executiu pstree -p

eco 'Hola món'

Aquí, la primera ordre pstree mostra el disseny original de l'arbre de processos. Un cop executada l'ordre exec, la segona ordre pstree substitueix l'intèrpret d'ordres en execució. L'ordre d'eco de l'última línia no s'ha executat.

Executeu l'script següent:

$ . / test.sh

Com que formava part de l'script, tornem a l'intèrpret d'ordres original després de l'execució correcta.

Com que l'ordre exec substitueix l'intèrpret d'ordres principal per una ordre/programa diferent, qualsevol codi posterior esdevé invàlid. Aneu amb compte quan els feu servir als vostres scripts.

Exemple 3: registre

L'intèrpret d'ordres Bash ofereix 3 descriptors de fitxers únics a qualsevol programa/script en execució:

  • STDOUT (1): sortida estàndard, emmagatzema la sortida normal
  • STDERR (2): error estàndard, emmagatzema missatges d'error
  • STDIN (0): entrada estàndard

Amb exec, podem redirigir aquests descriptors de fitxers a una ubicació diferent, per exemple: fitxers de registre. Pot ajudar amb la depuració i el registre en general.

En general, si voleu redirigir STDOUT i STDERR a un fitxer de registre, feu servir l'operador de redirecció:

$ eco $$ | samarreta registre.prova

$ monjo 2 >& 1 | samarreta registre.prova

Aquest mètode requereix la redirecció en cada punt que vulgueu registrar. Per resoldre aquest problema, podem utilitzar l'ordre exec per crear una redirecció permanent per a la sessió de shell. Consulteu l'exemple següent:

#!/bin/bash

> registre.prova

executiu 1 >> registre.prova

executiu 2 >& 1

eco 'Hola món'

ordre_errada

Aquí, la primera línia crea un fitxer de registre buit. La primera ordre exec estableix una redirecció permanent de STDOUT al fitxer de registre. La segona ordre exec redirigeix ​​STDERR a STDOUT.

Amb aquesta configuració, totes les sortides i missatges d'error s'aboquen al fitxer de registre:

$. / test.sh

$ gat registre.prova

Què passa si l'script genera entrades de registre contínues?

#!/bin/bash

> registre.prova

executiu 1 >> registre.prova

executiu 2 >& 1

mentre veritat

fer

eco $RANDOM

dormir 5

fet

Aquí, a la primera part, creem una redirecció permanent de STDOUT i STDERR al nostre fitxer de registre. El bucle while infinit executa l'ordre d'eco fins que el tanquem a la força amb 'Ctrl + C'. La variable $RANDOM és una variable especial que retorna una cadena aleatòria cada vegada que s'hi accedeix.

Per comprovar l'entrada del registre d'actualització, utilitzeu l'ordre de cua següent:

$ cua -f registre.prova

Tingueu en compte que aquesta redirecció només dura per a la sessió de shell.

Exemple 4: entrada des del fitxer

De la mateixa manera que hem creat una redirecció permanent STDOUT i STDERR, també podem crear-ne una per a STDIN. Tanmateix, com que s'utilitza STDIN per a l'entrada, la implementació és una mica diferent.

A l'script següent, prenem STDIN d'un fitxer:

#!/bin/bash

eco 'eco' Hola món '' > entrada

executiu < entrada

llegir línia_1

eval $line_1

Aquí, a la primera línia, utilitzem echo per generar el contingut del fitxer input_string mitjançant la redirecció. L'ordre exec redirigeix ​​el contingut de input_string a STDIN de la sessió de shell actual. Després de llegir la cadena, fem servir eval per tractar el contingut de $line_1 com un codi de shell.

Executeu l'script següent:

$ . / test.sh

Conclusió

Hem parlat sobre l'ordre exec a Bash. També vam mostrar les diferents maneres d'utilitzar-lo en els scripts. Hem demostrat l'ús d'exec per treballar amb múltiples shells, crear scripts eficients de memòria i redirigir els descriptors de fitxers.

Això és només una petita part del que es pot aconseguir amb l'escriptura Bash. Obteniu més informació sobre els scripts de Bash des de Programació Bash subcategoria.

Feliç informàtica!