
Como último comando de mi decrypt.sh
script, deseo que cree un shell nuevo en la carpeta recién creada con unset HISTFILE
.
En este punto, el usuario debería poder interactuar con este nuevo shell.
En esta carpeta habrá un encrypt.sh
script que el usuario puede ejecutar. Como última acción debe eliminar la carpeta y salir de este shell, devolviendo al usuario al shell original.
¿Cómo puedo lograr esto?
Si bien una solución bash sería útil para mí, una solución genérica puede ser útil para otra persona (¿pero tal vez imposible?).
Respuesta1
La decrypt.sh
secuencia de comandos:
#!/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 )
La encrypt.sh
secuencia de comandos:
#!/bin/bash
# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT
# rest of script goes here
El decrypt.sh
script se encarga de configurar el directorio de trabajo y eliminarlo. Configurar el directorio implica crearlo (usarlo mktemp -d
para crear un directorio temporal) y copiar el encrypt.sh
script en él desde donde se encuentre el original. La eliminación del directorio de trabajo ocurre cuando decrypt.sh
finaliza el script.
El encrypt.sh
script finalizará su shell principal cuando salga enviándole la HUP
señal, solicitando al decrypt.sh
script que elimine el directorio de trabajo. El directorio también se eliminará si el usuario sale del shell interactivo sin ejecutar encrypt.sh
.
En lugar de establecer HISTFILE
o /dev/null
intentardesarmadoen el shell interactivo creado, simplemente puede configurarlo HOME
en el directorio temporal. El archivo de historial se creará en $HOME
y se eliminará junto con el directorio cuando decrypt.sh
salga:
( cd "$tmpdir" && HOME="$tmpdir" bash )
Tenga en cuenta que esto afecta el comportamiento de la expansión de tilde y cd
sin argumento y cualquier otra cosa que pueda estar usando la HOME
variable.
Una variación menos invasiva es establecer la HISTFILE
variable explícitamente en un nombre de archivo en el directorio temporal:
( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )
Ligeramente relacionado: una herramienta que utiliza algunas de estas cosas (crea un shell interactivo en un directorio de trabajo temporal en un entorno limpio, con limpieza cuando el shell sale):
Descargo de responsabilidad: yo escribí eso.