No estoy muy familiarizado con exec
. Estaba realizando algunas pruebas y ejemplos. Quería pasarle un comando escrito en un archivo. Espero que ese comando se ejecute exec
como si se ejecutara directamente en la línea de comandos. Esto es lo que configuré y probé:
[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test file2 file3
. . .
Aquí está la parte más extraña. Ejecutar la última línea exec ls
no regresa. Es que el terminal se cuelga y no puedo comunicarme con él. Estoy pensando que este último problema podría ser un problema con Mobaxterm, que estoy usando para conectarme al servidor.
Respuesta1
Desde la bash
página de manual:
exec [-cl] [-a name] [command [arguments]]
Si
command
se especifica, reemplaza el shell. No se crea ningún proceso nuevo.[...]
Si
command
no se especifica, cualquier redireccionamiento tendrá efecto en el shell actual y el estado de retorno es 0.
tubería aexec
Lo primero que intentaste fue
cat exec_test | exec
Esto envía ls
a exec
la entrada estándar, no como un argumento. exec
se ejecuta sin argumentos y no tiene redirecciones, por lo que no hace nada.
Si desea ejecutar (o "ejecutar") los comandos del archivo, no es exec
para eso. Puedes hacerlo con source
(o la abreviatura .
):
source exec_test
tubería axargs exec
Lo siguiente que intentaste
cat exec_test | xargs exec
exec
es una fiestaincorporado. Solo está disponible dentro de bash, por lo que xargs
no puedo encontrarlo para ejecutarlo.
exec
en el caparazón principal
Finalmente lo intentaste
exec ls
Esto ejecutó ls
y luego colgó la terminal. Esto se debe a que, como está documentado, reemplazó el proceso de shell. Una vez que ls
ha terminado, ya no hay nada ejecutándose en la terminal. (Algunos emuladores de terminal se cerrarán automáticamente en este punto. Afortunadamente, el suyo no se cerró, por lo que aún podrá ver el resultado).
Elejemplo que intentabas seguirtuvo un paso extra:
bash
exec ls
Esto primero inicia uno nuevo bash
, que se ejecuta como hijo del de "nivel superior". Luego exec ls
reemplaza ese shell y sale. Luego se reanuda el shell principal, por lo que no te quedarás con una terminal atascada.