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?
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 unabash
subshell). Por lo tanto, las modificacionessomescript.sh
a 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
.
osource
.fuente
alias
comando, como sugirió scott.Si se ejecuta
./somescript.sh
como 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.fuente
Creo que el script que estás intentando ejecutar no es ejecutable.
chmod a+x somescript.sh
agregará 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.sh
le 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.fuente
export PATH=$PATH:/usr/local/bin
agregar / 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.sh
está ejecutando bien: está utilizando el comando de punto para obtener un archivo. tcsh usa "fuente" para la misma cosa.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
./
fuente
.
no por el./
que forma parte del nombre del archivo. Ejecutar ./somescript no lo ejecuta en el shell actual como lo. ./somescript
hace.