Dans ma copie du conda.sh
script, je vois les lignes suivantes:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Je suis curieux de savoir pourquoi il y a une barre oblique inverse devant le la d
dans dirname
. Je ne pense pas que ce soit nécessaire. Cette utilisation de barres obliques inverses apparaît également à d'autres endroits du fichier source. Y a-t-il une raison pour laquelle je manque cela?
bash
shell-script
extremeaxe5
la source
la source
Réponses:
La barre oblique inverse supprimera l'expansion d'alias, c'est-à-dire qu'elle exécute la commande d'origine et s'assure que la version d'alias ne s'exécute pas. Les scripts peuvent s'exécuter sans le savoir avec une extension d'alias lorsque le système est défini
shopt -s expand_aliases
(BASH uniquement) ou s'il est exécuté à l'aide desource
.Certains administrateurs système aiment mettre une barre oblique inverse dans tout comme mesure préventive contre les effets secondaires des alias, juste au cas où ils seraient aliasés involontairement ailleurs et l'alias est développé comme expliqué précédemment. Par exemple, si le système a défini cela
alias dirname='dirname -z'
quelque part et que la condition autorise l'extension de l'alias, un script qui tente d'appeler dirname appellera malheureusement à ladirname -z
place, ce qui n'était pas le script prévu.S'il est certain que de tels alias n'existent pas, nous pouvons supprimer toutes les barres obliques inverses et cela devrait fonctionner correctement.
Alternativement, on peut utiliser
command
au lieu de la version barre oblique inverse pour supprimer l'alias. Ainsi, au lieu de\dirname
, on peut utilisercommand dirname
, ce qui pourrait sembler plus lisible. (Pour les commandes intégrées commecd
, on devrait utiliser à labuiltin
place). Je préfère cela à la place, car il contourne également la fonction du même nom ainsi que tous les alias.la source
unalias -a
, qui supprime tous les alias.\unalias -a
supprimer l'expansion des alias/usr/bin/dirname
?/bin/ed
sur Ubuntu vs/usr/bin/ed
sur CentOS. Mettre un chemin complet rend le script moins portable.DIRNAME=$(which dirname)
, carwhich
ne voit pas d'alias?Si
conda.sh
un fichier est censé provenir, les barres obliques inverses sont destinées à contourner les alias. Bash désactive généralement l'expansion d'alias pour l'exécution de script, mais ce n'est pas le cas pour les fichiers d'origine, qui peuvent s'exécuter dans des shells interactifs. Il suffit doncdirname
d'exécuter un alias nommédirname
, mais d'\dirname
ignorer l'expansion d'alias et d'exécuter une fonction ou une commande nomméedirname
. (Pas seulement des contre-obliques, cependant, toute citation fera l'affaire.)la source
command dirname
.\command dirname
, au cas où quelqu'un aurait également créé un aliascommand
.): |