En mi copia del conda.sh
guión, veo las siguientes líneas:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Soy curioso en cuanto a por qué hay una barra invertida delante del el d
en dirname
. No creo que sea necesario. Este uso de barras invertidas también aparece en otros lugares en el archivo fuente. ¿Hay alguna razón para hacer esto que me falta?
bash
shell-script
extremeaxe5
fuente
fuente
Respuestas:
La barra invertida suprimirá la expansión de alias, es decir, ejecuta el comando original y se asegura de que la versión de alias no se ejecute. Los scripts pueden ejecutarse sin saberlo con expansión de alias cuando el sistema se ha configurado
shopt -s expand_aliases
(solo BASH) o si se ejecuta utilizandosource
.A algunos administradores de sistemas les gusta poner una barra invertida en todo como medida preventiva contra los efectos secundarios de los alias, solo en caso de que se haya alias involuntariamente en otro lugar y el alias se expanda como se explicó anteriormente. Por ejemplo, si el sistema ha configurado esto en
alias dirname='dirname -z'
algún lugar y la condición permite que el alias se expanda, entonces un script que intenta llamar a dirname desafortunadamente llamarádirname -z
, que no era el script previsto.Si hay certeza de que dicho alias no existe, podemos eliminar toda la barra invertida y debería funcionar bien.
Alternativamente, se puede usar en
command
lugar de la versión de barra diagonal inversa para suprimir el alias. Por lo tanto, en lugar de\dirname
, uno puede usarcommand dirname
, lo que podría parecer más legible. (Para comandos integrados comocd
, uno debería usarbuiltin
en su lugar). Prefiero esto en su lugar, ya que también omite la función con el mismo nombre, así como cualquier alias.fuente
unalias -a
que elimina todos los alias.\unalias -a
para suprimir la expansión de alias/usr/bin/dirname
?/bin/ed
Ubuntu vs/usr/bin/ed
CentOS. Poner una ruta completa hace que el script sea menos portátil.DIRNAME=$(which dirname)
, yawhich
que no ve alias?Si se
conda.sh
trata de un archivo de origen, las barras invertidas son para omitir los alias. Bash normalmente deshabilita la expansión de alias para la ejecución del script, pero para los archivos de origen, que pueden ejecutarse en shells interactivos, ese no es el caso. Por lo tanto,dirname
puede ejecutar un alias llamadodirname
, pero\dirname
omitirá la expansión del alias y ejecutará una función o comando llamadodirname
. (No solo las barras invertidas, sin embargo, cualquier cita servirá).fuente
command dirname
.\command dirname
, en caso de que alguien también haya creado un aliascommand
): |