¿Es posible que un script de shell de origen conozca su ubicación? He leído la determinación de ruta de acceso a shell script de origen , pero las respuestas se centran en bash
y tcsh
y fallar si se utiliza un shell POSIX. $0
tampoco es la solución y produce resultados incorrectos .
Una solución no necesita ser 100% confiable. Es poco probable que la ruta contenga enlaces duros o simbólicos.
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Algunos antecedentes: el script es parte de una aplicación existente que contiene docenas de archivos binarios en un bin
directorio en una ubicación conocida (varía según la arquitectura) en relación con el script de origen. Para usar la aplicación, el usuario obtiene el script que antepone el bin
directorio al PATH
, de modo que los binarios de la aplicación pueden invocarse fácilmente en el shell actual (cualquiera que sea el shell).
. /path/to/script
comoMARCO_DIR=/path/to; . $MARCO_DIR/script
oeval "$(/path/to/script)"
? @RahulPatilBASH_SOURCE
es obviamente específico de bash.Respuestas:
La ubicación del script de origen no está disponible a menos que esté utilizando un shell que ofrece extensiones a la especificación POSIX. Puede probar esto con el siguiente fragmento:
donde
included.sh
contieneEn bash, el nombre del script de origen está en
$BASH_SOURCE
. En zsh (en modo de compatibilidad zsh, no en modo de compatibilidad sh o ksh), está en$0
(tenga en cuenta que en una función,$0
es el nombre de la función en su lugar). En pdksh y dash, no está disponible. En ksh93, este método no revela la solución, pero la ruta completa al script incluido está disponible como${.sh.file}
.Si requerir bash o ksh93 o zsh es lo suficientemente bueno, puede usar este fragmento:
Puede intentar adivinar la ubicación del script mirando qué archivos ha abierto el shell. Experimentalmente, esto parece funcionar con dash y pdksh, pero no con bash o ksh93, que al menos para un script corto han cerrado el archivo de script para cuando llegan a ejecutarlo.
Es posible que el script no sea el archivo con el descriptor con el número más alto si el script se origina dentro de un script complejo que se ha estado jugando con redireccionamientos. Es posible que desee recorrer los archivos abiertos. No se garantiza que esto funcione de todos modos. La única forma confiable de localizar un script de fuente es usar bash, ksh93 o zsh.
Si puede cambiar la interfaz, entonces, en lugar de obtener su script, haga que imprima un fragmento de shell para que se lo pase a
eval
la persona que llama. Esto es lo que suelen hacer los scripts para establecer variables de entorno. Permite que su script se escriba independientemente de los caprichos del shell y la configuración de shell del llamante.En la persona que llama:
eval "`/path/to/setenv`"
fuente
Agregando a la respuesta de Gilles, PUEDE ser capaz de obtener el script de shell (
if $0 = ash
) a través de/proc/$$ interface
. No sé cuán preciso es esto, pero/proc/$$/fd/11
parece que siempre apunta a this_script con la ceniza de BusyBox.Brindar esto como una posible respuesta a quienes se encuentran con esta página (como lo hice yo).
La última respuesta se eliminó, por lo tanto, mi reclamo de este funcionamiento se prueba en 4 plataformas HW diferentes (x86, ARM, XLP y powerpc). Todos dan la misma respuesta de fd / 11. Un enlace de lectura
/proc/$$/fd/11
produce mi script.Andy
fuente