Por que um alias funciona às vezes como um nameref e outras vezes não?

1

Percebi um exemplo do link

$ alias foo=bar
$ foo () { blah "$@"; }
$ type -a foo bar  
foo is aliased to 'bar'
bar is a function
bar ()
{
    blah "$@"
}

Portanto, redefinir o alias foo na verdade redefine o comando de alias bar . Isso funciona como um nameref, ou seja, uma variável com o atributo de referência.

Eu experimentei mais com os exemplos a seguir.

  • Por que mya=cat não alias novamente mya to cat nem redefine o alias echo to cat ?

  • Por que mya () { cat test.sh; } redefine o aliased echo para a função, assim como um nameref?

Obrigado.

$ alias mya=echo
$ type mya
mya is aliased to 'echo'
$ mya abc  # mya behaves exactly as echo
abc

$ mya=cat
$ type mya
mya is aliased to 'echo'
$ mya test.sh # mya=cat doesn't alias mya to cat
test.sh


$ mya () { cat test.sh; }
$ type mya
mya is aliased to 'echo'
$ mya  # Redefining mya as a function works, by outputing the content of test.sh
#! /usr/bin/env bash
echo $_
echo $0
$ echo # Redefining mya also redefines the aliased echo, just like a nameref
#! /usr/bin/env bash
echo $_
echo $0
    
por Tim 04.08.2017 / 18:02

1 resposta

3

Um alias é expandido quando é a primeira palavra no comando. Então, quando você digita:

alias foo=bar
foo () { blah "$@"; }

o alias foo é expandido, por isso é tratado como se você tivesse digitado:

bar () { blah "$@"; }

Quando você digita:

alias mya=echo
mya=cat

a primeira palavra no comando é mya=cat , não apenas mya , portanto, o alias não é expandido. = não é um delimitador de palavras, é meramente o delimitador entre a variável e o valor em uma atribuição de variável.

    
por 05.08.2017 / 02:11

Tags