Aliases vs funções vs scripts

32

Este site diz: "As funções do shell são mais rápidas [do que os aliases]. Os aliases são procurados após as funções e, portanto, a resolução é mais lenta. Embora os aliases sejam mais fáceis de entender, as funções do shell são preferidas em relação a aliases para quase todos os propósitos. "

Dado que (verdadeiro ou não), como as funções do shell se comparam aos scripts de shell independentes? Alguém tem vantagens específicas sobre o outro, ou mais adequado para certos tipos de tarefas?

    
por Wolf 13.11.2010 / 15:25

1 resposta

42

A principal diferença entre aliases e funções é que aliases não aceitam argumentos¹, mas as funções sim. Quando você escreve algo como alias l='ls --color' , l foo é expandido para ls --color foo ; você não pode pegar foo na expansão do alias e fazer algo diferente com ele da maneira que você pode fazer com uma função. Veja também Como passar o parâmetro para o alias? .

Os aliases são pesquisados antes funções: se você tiver uma função e um alias chamado foo , foo invoca o alias. (Se o alias foo estiver sendo expandido, ele será temporariamente bloqueado, o que torna coisas como alias ls='ls --color' work. Além disso, você pode ignorar um alias a qualquer momento executando \foo .) Eu não esperaria ver um valor mensurável diferença de desempenho embora.

Funções e scripts autônomos têm recursos quase sempre semelhantes; Aqui estão algumas diferenças que eu posso pensar:

  • Uma função é executada dentro do ambiente do shell; um script é executado em um processo separado. Portanto, uma função pode alterar o ambiente do shell: definir variáveis de ambiente, alterar o diretório atual, etc. Um script independente não pode fazer isso.
  • Uma função deve ser escrita no idioma do shell no qual você deseja usá-la. Um script pode ser escrito em qualquer idioma.
  • As funções são carregadas quando são definidas. Os scripts são carregados sempre que são invocados. Isso tem várias conseqüências:
    • Se você modificar um script, receberá a nova versão na próxima vez que invocá-lo. Se você alterar a definição de uma função, terá que recarregar a definição.
    • As funções são mais rápidas em sistemas com carga pesada.
    • Se você tem muitas funções que você não pode usar, elas ocupam memória. Ksh e zsh, mas acho que não bash, tem uma forma de função autoloading.

Algo intermediário entre uma função e um script autônomo é um snippet de script que você lê com o source ou . incorporado. Como uma função, ela pode modificar o ambiente do shell e deve ser escrita na linguagem do shell. Como um script, ele é carregado toda vez que é invocado e não antes.

Sim, eu sei, isso não se aplica ao tcsh.

    
por 13.11.2010 / 16:06