tubería aexec

tubería aexec

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 execcomo 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 lsno 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 bashpágina de manual:

exec [-cl] [-a name] [command [arguments]]

Si commandse especifica, reemplaza el shell. No se crea ningún proceso nuevo.

[...]

Si commandno 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 lsa execla entrada estándar, no como un argumento. execse ejecuta sin argumentos y no tiene redirecciones, por lo que no hace nada.

Si desea ejecutar (o "ejecutar") los comandos del archivo, no es execpara eso. Puedes hacerlo con source(o la abreviatura .):

source exec_test

tubería axargs exec

Lo siguiente que intentaste

cat exec_test | xargs exec

execes una fiestaincorporado. Solo está disponible dentro de bash, por lo que xargsno puedo encontrarlo para ejecutarlo.

execen el caparazón principal

Finalmente lo intentaste

exec ls

Esto ejecutó lsy luego colgó la terminal. Esto se debe a que, como está documentado, reemplazó el proceso de shell. Una vez que lsha 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 lsreemplaza ese shell y sale. Luego se reanuda el shell principal, por lo que no te quedarás con una terminal atascada.

información relacionada