Quero criar um script bash ou algo semelhante que possa executar no shell atual:
echo '#!/bin/bash
export foo="bar" ' > zoom.sh
mas se eu quiser executar este script no processo atual:
exec ./zoom.sh
então meu terminal sairá do "processo concluído", mesmo se eu usar set +e
, ele ainda sairá.
Existe source
e eval
qual executará coisas no shell atual, então talvez eval seja minha melhor aposta? Uma função bash funcionará - mas source
, em primeiro lugar, preciso confiar no usuário .
Responder1
Do manual, parece que exec não criará um novo processo, apenas substituirá o shell atual; portanto, após a execução, ele encerrará a sessão também.
exec [-cl] [-a name] [command [arguments]]
:
se o comando for especificado, ele substituirá o shell. Nenhum novo processo é criado. Os argumentos tornam-se os argumentos para comandar. Se a opção -l for fornecida, o shell colocará um travessão no início do argumento zero passado ao comando. Isso é o que login(1) faz. A-c
opção faz com que o comando seja executado com um ambiente vazio. Se-a
for fornecido, o shell passa o nome como o argumento zero para o comando executado. Se o comando não puder ser executado por algum motivo, um shell não interativo será encerrado, a menos que a opção shellexecfail
esteja habilitada, caso em que retornará falha. Um shell interativo retorna falha se o arquivo não puder ser executado. Se o comando não for especificado, qualquer redirecionamento terá efeito no shell atual e o status de retorno será 0. Se houver um erro de redirecionamento, o status de retorno será 1.
$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed