¿Puedo usar un shebang para tener una fuente de archivo en el entorno bash actual?

¿Puedo usar un shebang para tener una fuente de archivo en el entorno bash actual?

Tengo una colección cada vez mayor deguionescualdebe obtenerse, no ejecutarse. De momento tienen el shebang

#! /bin/cat

pero preferiría que se obtengan en bash cuando se ejecuten, de la misma manera que lo hice

$ . /path/to/script.sh

o

$ source /path/to/script.sh

Pero .y sourceson funciones integradas de bash, entonces, ¿es posible una línea shebang alternativa para dichos scripts?

Respuesta1

No. Cuando entra en juego un tinglado, ya has perdido. Se aplica un shebang cuando se realiza un proceso exec()y, por lo general, eso sucede después de la bifurcación, por lo que ya estás en un proceso separado. No es el caparazón el que lee el shebang, es el núcleo.

Respuesta2

El she-bang es interpretado por el kernel cuando se ejecuta un comando, no por el shell. Así que para entonces ya será demasiado tarde.

Puedes hacerlo en su lugar:

#! /bin/echo Please run (from a Bourne-like shell): .

O:

#! /bin/sed 2,5!d;s/^#.//
# This script must be sourced from within a shell
# and not executed. For instance with:
# 
#   . path/to/that/script
rest of the script

Para decirle al usuario qué hizo mal.

Que debería funcionar en Linux. Reemplace todos los espacios excepto el primero con uno de los caracteres de espaciado que no sean ASCII (como U+00A0, U+2006...) en algunos otros sistemas operativos. Es posible que tengas que adaptar la ruta de las utilidades echoo sed.

Respuesta3

Como dice el usuario @muru, no es posible hacerlo porque ya abandonó la sesión de shell cuando llega a la #!línea -.

Sin embargo, dependiendo de lo que hagan sus archivos de shell, puede haber otra solución.

Supongo que establecen variables de entorno que usas para algún proyecto.

Llamemos a un proyecto subtool(porque es un proyecto que tengo). Entonces podría tener un script que configure un entorno de shell para proyectos, project-envpor ejemplo:

#!/bin/bash

PROJECT="$1"
PROJECT_ROOT="$HOME/projects/$PROJECT"

cd "$PROJECT_ROOT" || exit 1
source "$PROJECT.env"

export PS1="[$PROJECT: \W] \$ "
exec bash -i

Corre con:

$ ./project-env subtool

Esto ingresará automáticamente cda la subcarpeta del proyecto dada debajo de $HOME/projects, leerá un archivo de entorno del proyecto llamado subtool.enven este caso (en el que inicializa las variables), le dará una línea de comando para el proyecto y lo dejará en una bashsesión interactiva:

[subtool: subtool] $

Cuando termine su trabajo, simplemente exit.

Esto también tiene la ventaja de aislar el entorno del proyecto de su sesión de inicio de sesión "normal" y de otros proyectos.

Respuesta4

Las cosas que desea hacer en esos scripts .'ed están cambiando el proceso del shell; entonces necesitas llamarlos desde el proceso de shell; lo que significa alias o sus funciones de shell hermanas más poderosas. Esto significa que debe realizar alguna configuración en .profile o equivalente.

El truco del alias es algo simplista: alias mytool1=". /my/library/mytool1.sh"

¿Puedes leer todo desde el principio? .perfil: . /mi/biblioteca/define_tools.sh

define_mytools.sh: mytool1() { ... contenido de mytool1.sh ... } mytool2() { ...; }

información relacionada