Cree un shell bash nuevo a partir del script .sh

Cree un shell bash nuevo a partir del script .sh

Como último comando de mi decrypt.shscript, 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.shscript 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.shsecuencia 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.shsecuencia de comandos:

#!/bin/bash

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

# rest of script goes here

El decrypt.shscript se encarga de configurar el directorio de trabajo y eliminarlo. Configurar el directorio implica crearlo (usarlo mktemp -dpara crear un directorio temporal) y copiar el encrypt.shscript en él desde donde se encuentre el original. La eliminación del directorio de trabajo ocurre cuando decrypt.shfinaliza el script.

El encrypt.shscript finalizará su shell principal cuando salga enviándole la HUPseñal, solicitando al decrypt.shscript 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 HISTFILEo /dev/nullintentardesarmadoen el shell interactivo creado, simplemente puede configurarlo HOMEen el directorio temporal. El archivo de historial se creará en $HOMEy se eliminará junto con el directorio cuando decrypt.shsalga:

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

Tenga en cuenta que esto afecta el comportamiento de la expansión de tilde y cdsin argumento y cualquier otra cosa que pueda estar usando la HOMEvariable.

Una variación menos invasiva es establecer la HISTFILEvariable 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.

información relacionada