No manual do bash
As regras relativas à definição e uso de aliases são um tanto confusas. O Bash sempre lê pelo menos uma linha completa de entrada antes de executar qualquer um dos comandos nessa linha. Os aliases são expandidos quando um comando é lido, não quando é executado. Portanto, uma definição de alias que aparece na mesma linha que outro comando não entra em vigor até que a próxima linha de entrada seja lida. Os comandos que seguem a definição de alias nessa linha não são afetados pelo novo alias. Esse comportamento também é um problema quando as funções são executadas. Os aliases são expandidos quando uma definição de função é lida, não quando a função é executada , porque uma definição de função é ela mesma um comando composto. Como consequência, os aliases definidos em uma função não estarão disponíveis até que a função seja executada . Para ser seguro, sempre coloque definições de alias em uma linha separada e não use alias em comandos compostos.
As duas frases "Aliases são expandidas quando uma definição de função é lida, não quando a função é executada" e "aliases definidos em uma função não estão disponíveis até que após a execução dessa função" pareçam contrárias uma à outra.
Você pode explicar o que eles significam, respectivamente?
.bashrc
arquivos na parte superior.Respostas:
Os aliases são expandidos quando uma definição de função é lida, não quando a função é executada…
Mesmo que tenha
myfunc
sido definido para chamarmyalias
e redefinimyalias
,myfunc
ainda executa a definição original demyalias
. Porque o alias foi expandido quando a função foi definida. De fato, o shell não se lembra mais dasmyfunc
chamadasmyalias
; sabe apenas quemyfunc
chamacat
:… Os aliases definidos em uma função não estão disponíveis até que a função seja executada.
O
myalias
alias não está disponível até que amyfunc
função seja executada. (Eu acredito que seria bastante estranho se definir a função que define o alias fosse suficiente para fazer com que o alias fosse definido.)fonte
Preciso da resposta que é declarada pela primeira frase quando tento o trecho abaixo no meu
.bashrc
.depois
unalias -a; source ~/.bashrc
, tento executarlf
elsf
,parece claro que os aliases são expandidos na definição da função, não na execução da função, pois :
lf
, o erro-bash: ll: command not found
elsf
,/usr/bin/ls
é usado, não o formulário de alias, sem destaque de cor e sem caracteres de controle após o arquivo executável.fonte