Não estou muito familiarizado com exec
. Eu estava fazendo alguns testes e exemplos. Eu queria passar um comando escrito em um arquivo para ele. Espero que esse comando seja executado exec
como se fosse executado diretamente na linha de comando. Aqui está o que eu configurei e tentei:
[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
. . .
Aqui está a parte mais estranha. Executar a última linha exec ls
não retorna. Esse é o terminal trava e não consigo me comunicar com ele. Estou pensando que este último problema pode ser um problema com o Mobaxterm, que estou usando para fazer ssh no servidor.
Responder1
Na bash
página de manual:
exec [-cl] [-a name] [command [arguments]]
Se
command
for especificado, ele substitui o shell. Nenhum novo processo é criado.[...]
Se
command
não for especificado, qualquer redirecionamento terá efeito no shell atual e o status de retorno será 0.
tubo paraexec
A primeira coisa que você tentou foi
cat exec_test | exec
Isso é enviado ls
na exec
entrada padrão, não como um argumento. exec
é executado sem argumentos e não possui redirecionamentos, portanto não faz nada.
Se você deseja executar (ou "executar") o(s) comando(s) no arquivo, não é para isso exec
que serve. Você pode fazer isso com source
(ou a abreviatura .
):
source exec_test
tubo paraxargs exec
A próxima coisa que você tentou
cat exec_test | xargs exec
exec
é uma festaconstruídas em. Ele está disponível apenas no bash, portanto xargs
não consigo encontrá-lo para executá-lo.
exec
no shell principal
Finalmente você tentou
exec ls
Isso foi executado ls
e depois desligou o terminal. Isso porque, conforme documentado, ele substituiu o processo shell. Depois de ls
terminar, não há mais nada em execução no terminal. (Alguns emuladores de terminal fecharão automaticamente neste ponto. Felizmente, o seu não fechou, então você ainda poderá ver a saída.)
Oexemplo que você estava tentando seguirteve uma etapa extra:
bash
exec ls
Isso primeiro inicia um novo bash
, rodando como filho do de "nível superior". O exec ls
then substitui esse shell e sai. Em seguida, o shell pai é retomado, para que você não fique com um terminal travado.