${BASH_SOURCE[0]} équivalent dans zsh?
Le titre dit tout. Je suis à la recherche d'un équivalent de ${BASH_SOURCE[0]}
dans zsh.
Remarque: je continue de trouver "$0
est équivalent à ${BASH_SOURCE[0]}
" autour de l'Internet, mais cela semble être faux: $0
semble être le nom de l'exécution de la commande. (C'est argv[0]
, qui fait sens.) En écho à 0 $dans mon script (.zshrc
) donne zsh
pour $0
, ce qui n'est pas la même chose que ce ${BASH_SOURCE[0]}
est. En fait, ${BASH_SOURCE[0]}
semble fonctionner dans la zsh
, sauf pour l'intérieur de la .zshrc
fichiers.
Ce que je suis vraiment en train de faire dans mon .zshrc
(qui ne fonctionne pas):
echo ${BASH_SOURCE[0]}
source `dirname $0`/common-shell-rc.sh
La source d'échec ($0
est zsh
) et le echo
sorties d'une ligne vide.
Edit: apparemment, pour C'est apparemment sur, sauf si vous définissez $0
à travailler, j'ai besoin de l'option FUNCTION_ARGZERO
option. Aucun moyen de tester si cette option est définie dans un script? (afin que je puisse temporairement définir)nofunction_argzero
, et il est dans ma coquille. Toujours rien pour $0
. (Je pense que b/c je ne suis pas dans une fonction.)
Vous devez vous connecter pour publier un commentaire.
${BASH_SOURCE[0]}
équivalent dans zsh est${(%):-%N}
, PAS$0
(que l'OP a dit, ce dernier a échoué dans .zshrc)Ici
%
indique invite expansion sur la valeur,%N
indique que "Le nom du script, en provenance de fichier,ou de la fonction shell que zsh est actuellement en cours d'exécution,
selon ce qui a été commencé plus récemment. Si il y en a aucun, c'est l'équivalent du paramètre $0."(à partir de
man zshmisc
)$BASH_SOURCE
équivalent est%x
, pas%N
, car il se rapporte à l'affichage de fichier, même lorsqu'il est appelé à l'intérieur de fonctions - en d'autres termes: l'utilisation${(%):-%x}
:-
ici, et pourquoi${(%)%N}
ne fonctionnerait pas la même (note: je suis conscient qu'il ne fonctionne pas)readlink
à résoudre pour le chemin d'accès absolu:readlink -f ${(%):-%N}
${(%)%N}
est comme${%N}
, mais sous réserve de l' (%) drapeau.${%N}
serait tenter d'étendre la variable avec un vide-nom de la chaîne (ce qui n'est pas une chose réelle, mais toujours avec succès s'étend à rien) et de supprimer une fuite N. à l'Aide de${(%):-%N}
les tentatives d'extension de la même vide variable de chaîne, et puis depuis que du vide, utilise%N
comme valeur par défaut... qui est ensuite étendu comme une invite à cause du (%) du pavillon.${(%):-%x}
est le plus prochezsh
équivalent àbash
's$BASH_SOURCE
(etksh
's${.sh.file}
) - pas$0
.coup de chapeau à Hui Zheng pour fournir l'essentiel de pointeur et de l'information de fond en sa réponse.
Il renvoie le (potentiellement relative) chemin de la enfermant script,
~/.zshrc
(contrairement à$0
, qui inexplicablement renvoie la shells'chemin).$0
, qui renvoie le fonction nom à l'intérieur d'une fonction).La seule différence à
$BASH_SOURCE
que j'ai trouvé est le suivant obscur scénario - qui peut même être un bug (observé dans zsh 5.0.5): à l'intérieur d'une fonction imbriquée à l'intérieur d'une autre fonction dans une source de script,${(%):-%x}
ne pas retour de la enfermant chemin du script lorsque cette fonction imbriquée est appelé (à nouveau) plus tard, après avoir été source (renvoie rien ou "zsh").Informations d'arrière-plan sur
${(%):-%x}
:(%):-
en lieu et place d'un nom de variable dans un paramètre (variable) d'extension (${...}
) rend les séquences d'échappement qui sont normalement utilisés pour représenter des informations sur l'environnement dans invite des chaînes, comme utilisé dans lePS1
variable pour déterminer la chaîne affiche comme le principal invite interactive.%
est une instance d'un paramètre d'extension du pavillon, qui sont tous répertoriés dansman zshexpn
sous la rubriqueParameter Expansion Flags
.%x
est l'une des séquences d'échappement qui peut être utilisé dans l'invite de chaînes, et il fonctionne comme décrit ci-dessus; il y a beaucoup d'autres comme le%d
pour représenter le répertoire courant.man zshmisc
la liste de toutes les séquences sous la rubriqueSIMPLE PROMPT ESCAPES
.$0
est correct. Dans une source de script, c'est le nom d'un script, comme il a été transmis à la.
ousource
intégré (donc si lepath_dirs
option est activée, vous devrez peut-être faire un$path
de recherche pour trouver l'emplacement réel du script)..zshrc
n'est pas une source, ce qui explique pourquoi$0
n'est pas définie à.zshrc
. Vous connaissez le nom de fichier et l'emplacement de toute façon: c'est${ZDOTDIR-~}/.zshrc
.foo
contenantsource ./foo2
etfoo2
contenantecho $0
. Maintenant, exécutez./foo
, et vous aurez le résultat de./foo
, qui est pas le nom de la source de script. Remplacer$0
avec${BASH_SOURCE[0]}
, exécutez de nouveau avec bash, et vous obtiendrez./foo2
../foo2
(zsh 4.3.10, ce qui peut avoir changé à un certain point, mais pas depuis la 4.0). Par rapport à vos instructions, j'ai ajouté#!/bin/zsh
en haut defoo
, pour exécuter le script sous zsh. Êtes-vous sûr que vous êtes en cours d'exécutionfoo
sous zsh?zsh
(et éventuellement d'autres coquillages), la valeur de$0
est la source script n'est pas l'appelant de script. Ce n'est PAS la façon dont il fonctionne dans Bash. Donc$0
dans zsh est le même que${BASH_SOURCE[0]}
en Bash.zsh
normalement TOUJOURS les rapports de la script chemin d'accès dans$0
, , indépendamment de savoir si le script est en train d'être acquises ou pas. Apparemment, la seule exception, ce sont les initialisation/fichiers de profil, où zsh se comporte comme bash et ksh, réglage$0
à la shell chemin d'accès (en raison de sourcing). (Donc, si quelque chose, le fait que$0
ne pas reflètent le script chemin d'accès dans ce cas, est un autre indicateur que.zshrc
est source.) Le vrai zsh équivalent à$BASH_SOURCE
est${(%):-%x}
.zsh
est l'équivalent de$BASH_SOURCE
dans la plupart, mais pas tous, situations; les exceptions sont les suivantes: (a) dans initialisation/fichiers de profil (par exemple,~/.zshrc
)$0
inexplicablement rapports de la shell chemin d'accès, et (b) à l'intérieur d'un function il rapporte la fonction nom. Encore une fois, le vrai équivalent est${(%):-%x}
.Si vous êtes à faire un lien symbolique pour .zshrc dans un dotfiles directory et que vous souhaitez faire référence à d'autres fichiers dans le répertoire, puis essayez ceci:
(J'ai eu le script boucle de ici.)
Si vous voulez faire de votre script à la fois bash et zsh-compatible, vous pouvez utiliser
${BASH_SOURCE[0]:-${(%):-%x}}
. La valeur qui en résulte seront prises à partir deBASH_SOURCE[0]
lorsqu'il est défini, et${(%):-%x}}
quandBASH_SOURCE[0]
n'est pas défini.Peut-être que vous êtes à la recherche pour
$_
?et
rendements
${BASH_SOURCE:-$_}