Alias e funções

11

Do manual bash

The rules concerning the definition and use of aliases are somewhat confusing. Bash always reads at least one complete line of input before executing any of the commands on that line. Aliases are expanded when a command is read, not when it is executed. Therefore, an alias definition appearing on the same line as another command does not take effect until the next line of input is read. The commands following the alias definition on that line are not affected by the new alias. This behavior is also an issue when functions are executed. Aliases are expanded when a function definition is read, not when the function is executed, because a function definition is itself a compound command. As a consequence, aliases defined in a function are not available until after that function is executed. To be safe, always put alias definitions on a separate line, and do not use alias in compound commands.

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 a função seja executada" parecem ser contrários um ao outro. / p>

Você pode explicar o que eles significam, respectivamente?

    
por Tim 13.12.2016 / 08:07

2 respostas

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

    $ echo "The quick brown fox jumps over the lazy dog." > myfile
     
    $ alias myalias=cat
     
    $ myfunc() {
    >     myalias myfile
    > }
     
    $ myfunc
    The quick brown fox jumps over the lazy dog.
     
    $ alias myalias="ls -l"
     
    $ myalias myfile
    -rw-r--r-- 1 myusername mygroup 45 Dec 13 07:07 myfile
     
    $ myfunc
    The quick brown fox jumps over the lazy dog.

    Mesmo que myfunc tenha sido definido para chamar myalias , e eu redefined myalias , myfunc ainda executa a definição original de myalias . Porque o alias foi expandido quando a função foi definida. Na verdade, o shell não lembra mais que myfunc calls myalias ; ele sabe apenas que myfunc chama cat :

    $ type myfunc
    myfunc is a function
    myfunc ()
    {
    cat myfile
    }
  2. … aliases definidos em uma função não estão disponíveis até depois que a função é executada.

    $ echo "The quick brown fox jumps over the lazy dog." > myfile
     
    $ myfunc() {
    >     alias myalias=cat
    > }
     
    $ myalias myfile
    -bash: myalias: command not found
     
    $ myfunc
     
    $ myalias myfile
    The quick brown fox jumps over the lazy dog.

    O alias myalias não está disponível até que a função myfunc tenha sido executada. (Eu acredito que seria um pouco estranho se definir a função que define o alias foi o suficiente para fazer com que o pseudônimo fosse definido.)

por 13.12.2016 / 08:47
1

Preciso da resposta que é indicada pela primeira sentença quando tento usar o snippet abaixo em .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 de unalias -a; source ~/.bashrc , eu tento executar lf e 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 claramente que os aliases são expandidos na definição da função, não na execução da função, uma vez que :

  • quando executo lf , o erro -bash: ll: command not found e
  • quando executo lsf , /usr/bin/ls é usado, não o formato de alias, sem cor destaque, e nenhum chars de controle após o arquivo executável.
por 29.06.2017 / 15:43