Estoy aprendiendo exec
comando. Sé que el exec
comando reemplaza el proceso que lo inició. Por lo tanto, no es posible volver al proceso reemplazado por el exec
comando.
Se podría decir que su finalidad es hacer imposible volver al proceso que lo inició.
Pero, ¿cuáles son otros usos de tener algo como exec
disponible como comando?
Respuesta1
El exec
comando reemplaza el proceso de shell actual con el comando especificado. Normalmente, cuando ejecuta un comando, se genera (bifurca) un nuevo proceso. El exec
comando no genera un nuevo proceso. En cambio, el proceso actual se superpone con el nuevo comando. En otras palabras, el exec
comando se ejecuta en lugar del shell actual sin crear un nuevo proceso.
Hay tres usos más comunes del comando exec:
1. Reemplazo de proceso
Ejemplo 1:
Si abre un nuevo bash
shell como
$ bash
en pstree
ello parece
├─terminal-gnome ├─bash───bash───pstree
El caparazón anterior bash
todavía está allí y tienes un bash
caparazón nuevo. Mientras que si abres un nuevo shell bash como,
$ exec bash
los pstree
espectáculos
├─terminal-gnome ├─bash───pstree
Aquí lo viejo bash
se reemplaza por uno nuevo. Es particularmente útil salir de un inicio de sesión múltiple con un solo comando.Es más seguro y elimina la posibilidad de dejar un terminal abierto por error.VerSalga tanto del root como del usuario con un solo comando
Ejemplo-2:puedes abrir un archivo como
$ exec vi filename.txt
Cuando salga, vi
no es necesario cerrar el terminal por separado ya que el shell ya está reemplazado. Tan pronto como cierras el vi, la terminal también se cierra.
2. Un método de redirección de descriptores de archivos dentro de los scripts de shell
El exec
comando también se puede utilizar en scripts de shell para abrir, cerrar y copiar dinámicamente descriptores de archivos. Eso permite realizar la redirección de STDIN, STDERR, STDOUT y otros descriptores de archivos a varios archivos dentro del script de shell, en lugar de una cadena de invocación de comando. Si no especifica un comando o argumentos, puede especificar símbolos de redirección y descriptores de archivos para realizar estas funciones.
Digamos que tiene un script de shell script.sh
y desea tener un archivo de registro script.log
, puede usarlo exec
como,
LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1
que es equivalente a
./script &>> /path/to/script.log
./script >> /path/to/script.log 2>&1
3. Creando etapas del proceso usando el comando exec.
También puede utilizar el comando exec para crear un conjunto de scripts de shell que se ejecutan entre sí secuencialmente como etapas del proceso. En lugar de generar nuevos procesos cada vez que necesita transferir el control al siguiente script, ejecuta el comando exec.
En este caso, la última declaración de cada etapa debe ser exec
el comando que invoca la siguiente etapa.
Verlos usos del exec
comando en scripts de shellpara más.
Nota:Parte de lo anterior está tomado deeste.
Respuesta2
En script contenedor
exec
se utiliza principalmente en scripts contenedores.
Si desea modificar el entorno de un programa antes de ejecutar el programa principal, normalmente escribirá un script y al final iniciará el programa principal. Pero no es necesario que el guión permanezca en la memoria en ese momento. Entonces, exec
se utiliza en estos casos para que el programa principal pueda reemplazar al script madre.
He aquí un ejemplo práctico de ello. Su mate-terminal.wrapper
script viene con mate-terminal. Comienza mate-terminal
con algunos argumentos adicionales al verificar los entornos del usuario.
#!/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);
El punto a tener en cuenta aquí es que hay una exec
llamada que reemplaza este script en la memoria.
Aquí hay una pregunta similar respondida en el sitio StackExchange de Unix y Linux:https://unix.stackexchange.com/q/270929/19288
Para redirigir descriptores de archivos
Otro uso común de exec
es redirigir descriptores de archivos. stdin
, stdout
, stderr
se pueden redirigir a archivos usando exec.
Redirigir
stdout
:exec 1>file
hará que la salida estándar sea un archivo con el nombrefile
del final de la sesión de shell actual. Todo lo que se envíe a la pantalla estará en el archivo.Redirección
stdin
: también se puede utilizar para redirigirstdin
a un archivo. Por ejemplo, si desea ejecutar un archivo de secuencia de comandosscript.sh
, puede redirigirlostdin
al archivo usandoexec 0<script.sh
.
Respuesta3
Hasta donde yo sé, también se usa para redirigir descriptores de archivos (por ejemplo, STDOUT, STDERR, STDIN) de un script bash.
Entonces, por ejemplo, puede leer desde un archivo en lugar del teclado usando la redirección STDIN y escribir en un archivo en lugar del terminal mediante la redirección STDOUT (o podría ser STDERR dependiendo del programa).