without update chsh shell zsh

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í).
  • 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 variable PS1 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 en man zshexpn bajo el encabezado Parameter 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 encabezado SIMPLE PROMPT ESCAPES .