shell - update - zsh vs bash
${BASH_SOURCE[0]} equivalente en zsh? (5)
El título debería decirlo todo. Estoy buscando un equivalente a ${BASH_SOURCE[0]}
en zsh.
Nota: Sigo buscando " $0
es equivalente a ${BASH_SOURCE[0]}
" en Internet, pero parece ser falso: $0
parece ser el nombre del comando de ejecución. (Es argv[0]
, lo cual tiene sentido.) .zshrc
eco de $ 0 en mi script ( .zshrc
) da zsh
por $0
, que no es lo mismo que ${BASH_SOURCE[0]}
. De hecho, ${BASH_SOURCE[0]}
parece funcionar en zsh
, excepto en el interior de los archivos .zshrc
.
Lo que realmente estoy haciendo en mi .zshrc
(eso no funciona):
echo ${BASH_SOURCE[0]}
source `dirname $0`/common-shell-rc.sh
La fuente falla ( $0
es zsh
) y el echo
genera una línea en blanco.
Editar: al parecer, por $0
para trabajar, necesito la opción opción FUNCTION_ARGZERO
establecida.¿Hay alguna manera de probar si esto está establecido en un script? (para que pueda establecerlo temporalmente) Aparentemente está activado a menos que establezca nofunction_argzero
, y está nofunction_argzero
en mi caparazón. Todavía no obtienes nada por $0
. (Creo que b / c no estoy en una función).
¿Tal vez estás buscando $_
?
# foo.sh
source foo2.sh
y
# foo2.sh
echo $_
rendimientos
# ./foo.sh
foo2.sh
Si está enlazando simbólicamente a .zshrc en un directorio de archivos punto y desea hacer referencia a otros archivos en el directorio, intente esto:
SOURCE=${(%):-%N}
while [ -h "$SOURCE" ]; do
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DOTFILES_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
(Obtuve el script de bucle desde here ).
$0
es correcto En un script de origen, este es el nombre de un script, ya que se pasó al .
o source
incorporada (de modo que si se establece la opción path_dirs
, es posible que deba hacer una búsqueda de $path
para encontrar la ubicación real del script).
.zshrc
no tiene origen, lo que explica por qué $0
no está configurado en .zshrc
. Ya conoce el nombre y la ubicación del archivo: es ${ZDOTDIR-~}/.zshrc
.
${BASH_SOURCE[0]}
equivalente en zsh es ${(%):-%N}
, NO $0
(como dijo OP, este último falló en .zshrc)
Aquí %
indica expansión de solicitud en el valor, %N
indica "El nombre del script, archivo de origen o función de shell que zsh está ejecutando actualmente,
lo que comenzó más recientemente. Si no hay ninguno, esto es equivalente al parámetro $ 0. "( man zshmisc
)
${(%):-%x}
es el zsh
equivalente más cercano a $BASH_SOURCE
(y ksh
${.sh.file}
) - no $0
.
Consejo del sombrero a Hui Zheng por proporcionar el puntero crucial y la información de fondo en su respuesta .
Devuelve la ruta (potencialmente relativa) del script adjunto,
- independientemente de si el script se está obteniendo o no.
- específicamente, también funciona dentro de archivos de inicialización / perfiles como
~/.zshrc
(a diferencia de$0
, que inexplicablemente devuelve la ruta del shell allí).
- específicamente, también funciona dentro de archivos de inicialización / perfiles como
- independientemente de si se llama desde dentro de una función definida en el script o no (a diferencia de
$0
, que devuelve el nombre de la función dentro de una función).
La única diferencia a $BASH_SOURCE
que he encontrado está en el siguiente escenario oscuro, que incluso puede ser un error (observado en zsh 5.0.5): dentro de una función anidada dentro de otra función en un script de origen, ${(%):-%x}
no devuelve la ruta del guión adjunto cuando se llama (nuevamente) a esa función anidada más tarde , después de haber sido originada (devuelve nada o ''zsh'').
Información de antecedentes sobre ${(%):-%x}
:
(%):-
en lugar de un nombre de variable en un parámetro (variable), la expansión (${...}
) hace que las secuencias de escape estén disponibles y que normalmente se utilizan para representar información ambiental en cadenas de aviso , como las utilizadas en la variablePS1
para determinar la cadena que se muestra como el indicador interactivo principal.-
%
es una instancia de un indicador de expansión de parámetro, todos los cuales se enumeran enman zshexpn
bajo el encabezadoParameter Expansion Flags
.
-
%x
es una de las secuencias de escape que se puede usar en cadenas de aviso, y funciona como se describió anteriormente; hay muchos más, como%d
para representar el directorio actual.-
man zshmisc
enumera todas las secuencias disponibles bajo el encabezadoSIMPLE PROMPT ESCAPES
.
-