ti-enxame.com

Aliases vs funções vs scripts

Este site diz, "As funções do shell são mais rápidas [do que os aliases]. Os aliases são pesquisados ​​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 aos aliases para quase todos os fins . "

Considerando isso (verdadeiro ou não), como as funções do Shell se comparam aos scripts Shell autônomos? Um tem vantagens particulares sobre o outro ou é mais adequado para certos tipos de tarefas?

37
Wolf

A principal diferença entre apelidos e funções é que apelidos não aceitam argumentos¹, mas 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 das funções : se você tiver uma função e um alias chamado foo, foo invoca o alias. (Se o alias foo está sendo expandido, está temporariamente bloqueado, o que torna coisas como alias ls='ls --color' trabalhos. Além disso, você pode ignorar um alias a qualquer momento executando \foo.) Eu não esperaria ver uma diferença mensurável de desempenho.

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

  • Uma função é executada dentro do ambiente Shell; um script é executado em um processo separado. Portanto, uma função pode alterar o ambiente 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 em que 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 chamados. Isso tem várias consequências:
    • Se você modificar um script, obterá a nova versão na próxima vez que o invocar. 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 muito carregados.
    • Se você tiver muitas funções que não pode usar, elas ocuparão memória. Ksh e zsh, mas acho que não bash, tem uma forma de autoloading de função.

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

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

46