
Como último comando do meu decrypt.sh
script, 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.sh
script 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.sh
roteiro:
#!/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.sh
roteiro:
#!/bin/bash
# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT
# rest of script goes here
O decrypt.sh
script se encarrega de configurar o diretório de trabalho e excluí-lo. Configurar o diretório envolve criá-lo (usando mktemp -d
para criar um diretório temporário) e copiar o encrypt.sh
script para ele de onde quer que o original esteja localizado. A exclusão do diretório de trabalho ocorre quando o decrypt.sh
script termina.
O encrypt.sh
script encerrará seu shell pai quando ele sair, enviando-lhe o HUP
sinal, solicitando que o decrypt.sh
script 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 HISTFILE
ou /dev/null
tentardesarmarno shell interativo criado, você pode simplesmente configurá-lo HOME
para o diretório temporário. O arquivo de histórico será criado $HOME
e será excluído junto com o diretório quando decrypt.sh
sair:
( cd "$tmpdir" && HOME="$tmpdir" bash )
Observe que isso afeta o comportamento da expansão do til e do cd
sem argumento e qualquer outra coisa que possa estar usando a HOME
variável.
Uma variação menos invasiva é definir a HISTFILE
variá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.