Na minha cópia do conda.sh
script, vejo as seguintes linhas:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Estou curioso para saber por que há uma barra invertida na frente do d
in dirname
. Não acredito que seja necessário. Esse uso de barras invertidas também aparece em outros lugares no arquivo de origem. Existe uma razão para fazer isso que estou perdendo?
A barra invertida suprime a expansão do alias, ou seja, executa o comando original e garante que a versão do alias não seja executada. Os scripts podem ser executados inadvertidamente com expansão de alias quando o sistema estiver definido
shopt -s expand_aliases
(somente BASH) ou se for executado usandosource
.Alguns administradores de sistema gostam de colocar uma barra invertida em tudo como medida preventiva contra os efeitos colaterais de aliases, caso tenha sido alias involuntariamente em outro lugar e o alias seja expandido conforme explicado anteriormente. Por exemplo, se o sistema tiver definido isso
alias dirname='dirname -z'
em algum lugar e a condição permitir que o alias seja expandido, um script que tente chamar dirname infelizmente chamarádirname -z
, o que não era o script pretendido.Se houver certeza de que esse alias não existe, podemos remover toda a barra invertida e deve funcionar bem.
Alternativamente, pode-se usar
command
em vez da versão de barra invertida para suprimir o alias. Assim, em vez de\dirname
, pode-se usarcommand dirname
, que pode parecer mais legível. (Para comandos internos comocd
, deve-se usarbuiltin
em vez disso). Eu prefiro isso, pois também ignora a função com o mesmo nome, bem como qualquer aliase.Se
conda.sh
for um arquivo destinado a ser originado, as barras invertidas são para ignorar aliases. O Bash normalmente desabilita a expansão de alias para execução de script, mas para arquivos de origem, que podem ser executados em shells interativos, esse não é o caso. Portanto, apenasdirname
pode executar um alias chamadodirname
, mas\dirname
pulará a expansão do alias e executará uma função ou comando chamadodirname
. (Não apenas barras invertidas, no entanto, qualquer citação serve.)