Saltar al contenido

¿Cómo invocar bash, ejecutar comandos dentro del nuevo shell y luego devolver el control al usuario?

Ten en cuenta que en las ciencias cualquier problema suele tener varias resoluciones, de igual modo nosotros enseñaremos lo más óptimo y eficiente.

Solución:

bash --rcfile <(echo '. ~/.bashrc; some_command')

dispensa la creación de archivos temporales. Pregunta en otros sitios:

  • https://serverfault.com/questions/368054/ejecutar-un-interactivo-bash-subshell-con-comandos-iniciales-sin-regresar-al-
  • https://unix.stackexchange.com/questions/123103/how-to-keep-bash-running-after-command-execution

Esta es una respuesta tardía, pero tuve exactamente el mismo problema y Google me envió a esta página, así que para completar, así es como resolví el problema.

Por lo que yo puedo decir, bash no tiene la opción de hacer lo que quería hacer el cartel original. Él -c La opción siempre regresará después de que se hayan ejecutado los comandos.

solución rota: El intento más simple y obvio en torno a esto es:

bash -c 'XXXX ; bash'

Esto funciona en parte (aunque con una capa adicional de subcapa). Sin embargo, el problema es que, si bien una subcapa heredará las variables de entorno exportadas, los alias y las funciones no se heredan. Entonces, esto podría funcionar para algunas cosas, pero no es una solución general.

Mejor: La forma de evitar esto es crear dinámicamente un archivo de inicio y llamar a bash con este nuevo archivo de inicialización, asegurándose de que su nuevo archivo de inicio llame a su habitual ~/.bashrc si necesario.

# Create a temporary file
TMPFILE=$(mktemp)

# Add stuff to the temporary file
echo "source ~/.bashrc" > $TMPFILE
echo "" >> $TMPFILE
echo "rm -f $TMPFILE" >> $TMPFILE

# Start the new bash shell 
bash --rcfile $TMPFILE

Lo bueno es que el archivo de inicio temporal se eliminará tan pronto como se use, lo que reduce el riesgo de que no se limpie correctamente.

Nota: no estoy seguro de si /etc/bashrc generalmente se llama como parte de un shell normal sin inicio de sesión. Si es así, es posible que desee obtener /etc/bashrc, así como su ~/.bashrc.

Puedes pasar --rcfile a Bash para que lea un archivo de su elección. Este archivo se leerá en lugar de su .bashrc. (Si eso es un problema, fuente ~/.bashrc del otro guión.)

Editar: Entonces, una función para comenzar un nuevo shell con las cosas de ~/.more.sh se vería algo como:

more()  bash --rcfile ~/.more.sh ; 

... y en .more.sh tendría los comandos que desea ejecutar cuando se inicie el shell. (Supongo que sería elegante evitar un archivo de inicio separado; no puede usar la entrada estándar porque entonces el shell no será interactivo, pero podría crear un archivo de inicio desde un documento aquí en una ubicación temporal y luego leerlo).

Recuerda que puedes comentar .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *