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.