Ejecutar script en el shell actual sin. antes del comando

26

Si se debe ejecutar un script en el shell actual, se puede lograr agregando un punto antes del comando:

   . ./somescript.sh

¿Hay alguna manera de hacer esto sin escribir el punto cada vez? Por ejemplo, ¿un comando para cambiar al shell principal desde el script mismo?

alu
fuente

Respuestas:

22

Puede que no sea exactamente lo que quieres, pero podrías hacer lo siguiente:

alias somescript.sh='. ./somescript.sh'
Scott
fuente
2
Esto resolvió mi problema perfectamente. ¡Gracias!
alu
8

¿Hay alguna manera de hacer esto sin escribir el punto cada vez? Por ejemplo, ¿un comando para cambiar al shell principal desde el script mismo?

No creo que lo haya (aparte de escribir source somescript.sh, pero eso probablemente no sea lo que estás buscando ^^).

Si ejecuta el script como de costumbre ./somescript.sh, entonces el shell bifurca y ejecuta este comando. Pasa el comando al kernel y luego el kernel decide cómo se ejecutará este comando al analizar la #!línea dentro del script. El kernel luego inicia el intérprete especificado (en este caso, probablemente una bashsubshell). Por lo tanto, las modificaciones somescript.sha su entorno están aisladas en el subshell sin afectar el shell principal.

Si desea que el shell lea el script en sí mismo sin iniciar otro proceso, debe indicarlo explícitamente utilizando la palabra clave .o source.

Martin von Wittich
fuente
Gracias por la explicación detallada. :) Ahora veo que no hay forma de hacerlo desde el script llamado, pero afortunadamente se le puede decir al shell principal que no cree un subshell con el aliascomando, como sugirió scott.
alu
1

Si se ejecuta ./somescript.shcomo un programa externo, no puede hacer nada dentro del proceso de ejecución del shell, como acceder a variables no exportadas, establecer variables, cambiar el directorio actual, etc. No hay forma de evitar esto.

(Bueno, está bien, es posible que pueda ejecutar un depurador desde el subproceso y modificar la memoria del proceso principal. Pero si lo intenta, el resultado más probable es que se bloquee el shell principal).

Necesitas correr . ./somescript.sh. Puede ocultarlo detrás de un alias o función si lo desea, pero nuevamente la definición de alias o función debe hacerse en el shell principal.

Gilles 'SO- deja de ser malvado'
fuente
0

Creo que el script que estás intentando ejecutar no es ejecutable. chmod a+x somescript.shagregará el bit de ejecución para usuario, grupo y otros (ugo) a ese archivo. La primera línea del archivo también necesitará el #! línea en la parte superior, como #!/bin/bash.

ls -l somescript.shle mostrará los tripletes rwx (lectura / escritura / ejecución) para el archivo. Necesitará una x en al menos el primer conjunto, suponiendo que sea el propietario del archivo.

AR Diederich
fuente
Los scripts en sí funcionan bien, pero quiero ejecutarlos en el shell actual para poder modificar las variables de entorno del shell.
alu
Si exportar la variable que desea en el script no funciona, como export PATH=$PATH:/usr/local/binagregar / usr / local / bin a su $ PATH, entonces necesita obtener el archivo para cambiar sus variables de entorno en ejecución. Esta pregunta es realmente "¿Cómo cambio programáticamente mis variables de entorno en mi shell en ejecución desde un script bash?" La secuencia de comandos se . ./somescript.shestá ejecutando bien: está utilizando el comando de punto para obtener un archivo. tcsh usa "fuente" para la misma cosa.
AR Diederich
Modificar una variable fue solo un ejemplo. Mi pregunta es si es posible decirle al shell que debería haber un punto sin escribirlo realmente (por ejemplo, desde el script en sí)
alu
El punto puede olvidarse fácilmente, lo que puede cambiar el comportamiento del script por completo.
alu
0
export PATH=$PATH:.

Ejecutar ese comando en el shell o agregarlo a su archivo de configuración del shell agregará el directorio actual a la variable PATH. La variable PATH es una lista de directorios donde su shell buscará binarios para ejecutar cuando emita un comando.

Esto le permitirá ejecutar cualquier ejecutable en el directorio actual sin ./

GabeDain
fuente
1
El OP pregunta por el primero, .no por el ./que forma parte del nombre del archivo. Ejecutar ./somescript no lo ejecuta en el shell actual como lo . ./somescripthace.
Anthon