Alias ​​e funções

17

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?

StackExchange for All
fonte
Boa pergunta! Inclinei algo novo hoje. Eu aprendi duas coisas, na verdade: 1) essas informações sobre a expansão do alias no momento em que a função def é lida e 2) que eu realmente deveria ler o manual do bash com cuidado (o que eu pensei que já tinha, mas aparentemente não ^ ^ )
Olivier Dulac
4
A principal questão é: alguém deve usar aliases no modo não interativo? É para isso que servem as funções e os aliases tornam os scripts mais propensos a erros. Na verdade, nunca precisei das informações acima, porque só encontrei aliases em .bashrcarquivos na parte superior.
orion

Respostas:

29
  1. Os aliases são expandidos quando uma definição de função é lida, não quando a função é executada…

    $ echo "A rápida raposa marrom pula sobre o cachorro preguiçoso." > myfile
     
    $ alias myalias = cat
     
    $ myfunc () {
    > myalias myfile
    >}
     
    $ myfunc
    A rápida raposa marrom pula sobre o cachorro preguiçoso.
     
    $ alias myalias = "ls -l"
     
    $ myalias myfile
    -rw-r - r-- 1 myusername mygroup 45 dez 13 07:07 myfile
     
    $ myfunc
    A rápida raposa marrom pula sobre o cachorro preguiçoso.

    Mesmo que tenha myfuncsido definido para chamar myaliase redefini myalias, myfuncainda executa a definição original de myalias. Porque o alias foi expandido quando a função foi definida. De fato, o shell não se lembra mais das myfuncchamadas myalias; sabe apenas que myfuncchama cat:

    $ type myfunc
    myfunc é uma função
    myfunc ()
    {
    myfile de gato
    }
  2. … Os aliases definidos em uma função não estão disponíveis até que a função seja executada.

    $ echo "A rápida raposa marrom pula sobre o cachorro preguiçoso." > myfile
     
    $ myfunc () {
    > alias mialias = gato
    >}
     
    $ myalias myfile
    -bash: myalias: comando não encontrado
     
    $ myfunc
     
    $ myalias myfile
    A rápida raposa marrom pula sobre o cachorro preguiçoso.

    O myaliasalias não está disponível até que a myfuncfunçã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.)

G-Man Diz 'Reinstate Monica'
fonte
4
+1, boa resposta. Um "corolário" importante disso é que, se pretender definir funções e aliases em um script, coloque melhor a definição de alias antes das definições de funções! (óbvio, agora, dada a resposta, mas eu não sabia disso).
Olivier Dulac
Obrigado. Eu acho que um problema subjacente é a diferença entre executar a definição de uma função e chamar uma função. Especificamente, quais operações de shell são executadas durante a execução da definição de uma função e durante a chamada da função, respectivamente? Existe alguma operação de shell executada durante a execução da definição de uma função e a chamada da função, ou a execução da definição de uma função e a chamada da função executam um conjunto não sobreposto de operações de shell?
StackExchange for All
Bem, é um pouco como a diferença entre construir um carro e dirigir um carro. Ou comprando um sanduíche e comendo um sanduíche. Forneci uma resposta mais detalhada para sua outra pergunta .
G-Man diz 'Reinstate Monica'
Obrigado. Depois de reler a citação do manual do bash e sua resposta, estou confuso sobre o significado de executar uma função. Significa executar a definição de uma função ou chamar uma função? Veja unix.stackexchange.com/q/384209/674
StackExchange for All
1

Preciso da resposta que é declarada pela primeira frase quando tento o trecho abaixo no meu.bashrc .

alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
    local CMD=${1:-ls} DIR=${2:-.};
    $CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; }     # list all file, no directories

depois unalias -a; source ~/.bashrc, tento executar lfe lsf,

$ lf
-bash: ll: command not found

$ lsf
./file1 ./file2 ./script.sh ...     # no color, no control-chars

$ ls $(find -maxdepth 1 -type f)
./file1 ./file2 ./script.sh* ...

parece claro que os aliases são expandidos na definição da função, não na execução da função, pois :

  • quando executo lf, o erro -bash: ll: command not founde
  • quando executo lsf, /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.
qeatzy
fonte