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 porque é que há uma barra invertida na frente do a d
no 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?
bash
shell-script
extremeaxe5
fonte
fonte
Respostas:
A barra invertida suprimirá a expansão do alias, ou seja, ele executa o comando original e garante que a versão do alias não seja executada. Os scripts podem ser executados sem saber com expansão de alias quando o sistema tiver definido
shopt -s expand_aliases
(apenas BASH) ou se for executado usandosource
.Alguns administradores de sistema gostam de colocar barra invertida em tudo como uma medida preventiva contra os efeitos colaterais de aliases, apenas no caso de ter sido aliasado acidentalmente em outro lugar e o alias ser expandido conforme explicado anteriormente. Por exemplo, se o sistema definiu isso em
alias dirname='dirname -z'
algum lugar e a condição permite que o alias seja expandido, um script que tenta chamar dirname infelizmente chamarádirname -z
, mas esse não foi o script pretendido.Se houver certeza de que esse alias não existe, podemos remover toda a barra invertida e deve funcionar bem.
Como alternativa, pode-se usar em
command
vez da versão de barra invertida para suprimir o alias. Assim, em vez de\dirname
, pode-se usarcommand dirname
, o que pode parecer mais legível. (Para comandos internos comocd
, deve-se usarbuiltin
). Em vez disso, prefiro isso, pois também ignora a função com o mesmo nome e com qualquer apelido.fonte
unalias -a
, que remove todos os aliases.\unalias -a
suprimir a expansão de alias/usr/bin/dirname
?/bin/ed
no Ubuntu vs/usr/bin/ed
no CentOS. Colocar um caminho completo torna o script menos portátil.DIRNAME=$(which dirname)
, uma vezwhich
que não vê aliases?Se
conda.sh
é um arquivo que deve ser originado, as barras invertidas servem para ignorar aliases. O Bash normalmente desativa 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 nomeadodirname
, mas\dirname
ignorará a expansão do alias e executará uma função ou comando nomeadodirname
. (Porém, não apenas barras invertidas, qualquer citação serve.)fonte
command dirname
.\command dirname
, apenas no caso de alguém também ter feito um pseudônimocommand
.): |