Crie um novo shell bash a partir do script .sh

Crie um novo shell bash a partir do script .sh

Como último comando do meu decrypt.shscript, desejo que ele crie um novo shell na pasta recém-criada com unset HISTFILE.

Neste ponto o usuário deverá ser capaz de interagir com este novo shell.

Nesta pasta estará um encrypt.shscript que o usuário poderá executar. Como última ação deve deletar a pasta e sair deste shell, retornando o usuário ao shell original.

Como posso fazer isso?

Embora uma solução bash seja útil para mim, uma solução genérica pode ser útil para outra pessoa (mas talvez impossível?).

Responder1

O decrypt.shroteiro:

#!/bin/bash

# Create working directory.
tmpdir=$(mktemp -d)

# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT

# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"

# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )

O encrypt.shroteiro:

#!/bin/bash

# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT

# rest of script goes here

O decrypt.shscript se encarrega de configurar o diretório de trabalho e excluí-lo. Configurar o diretório envolve criá-lo (usando mktemp -dpara criar um diretório temporário) e copiar o encrypt.shscript para ele de onde quer que o original esteja localizado. A exclusão do diretório de trabalho ocorre quando o decrypt.shscript termina.

O encrypt.shscript encerrará seu shell pai quando ele sair, enviando-lhe o HUPsinal, solicitando que o decrypt.shscript remova o diretório de trabalho. O diretório também será excluído se o usuário sair do shell interativo sem executar o encrypt.sh.


Em vez de definir HISTFILEou /dev/nulltentardesarmarno shell interativo criado, você pode simplesmente configurá-lo HOMEpara o diretório temporário. O arquivo de histórico será criado $HOMEe será excluído junto com o diretório quando decrypt.shsair:

( cd "$tmpdir" && HOME="$tmpdir" bash )

Observe que isso afeta o comportamento da expansão do til e do cdsem argumento e qualquer outra coisa que possa estar usando a HOMEvariável.

Uma variação menos invasiva é definir a HISTFILEvariável explicitamente para um nome de arquivo no diretório temporário:

( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )

Ligeiramente relacionado: uma ferramenta que usa algumas dessas coisas (cria um shell interativo em um diretório de trabalho temporário em um ambiente limpo, com limpeza quando o shell é encerrado):

Isenção de responsabilidade: eu escrevi isso.

informação relacionada