Eu teria dito que é simplesmente Tail Ligue Otimização , mas na verdade (como o último link aponta), bash
não otimiza as chamadas finais. Parece apenas otimizar o caso em que o comando a ser executado é um comando simples (isto é, não um comando composto).
O segundo comando não é uma chamada final de pstree
, porque pstree
não é a última coisa na linha de comando. (É uma chamada de retorno de echo
, mas echo
é normalmente um built-in, portanto, nenhum subprocesso será criado, independentemente disso.)
Para salvar a leitura de todos esses links (embora eu espero que eles sejam interessantes), a idéia é que se você souber que uma função / programa / qualquer coisa retornará imediatamente depois de chamar outra função / programa / qualquer coisa e que o valor retornado será o valor retornado pela função chamada / programa / qualquer coisa, então você pode também reutilizar o quadro de pilha atual (ou processo, no caso de um script de shell) em vez de empurrar um novo quadro de pilha (criando um novo processo) , chamando a função (executando o script) e retornando. Em um script de shell, você pode fazer isso manualmente usando exec
para o último comando, mas seria possível para o shell fazer isso automaticamente.
zsh
e ksh
parecem ser capazes de fazer isso, mas não bash
:
$ zsh -c 'if [[ -n foo ]]; then pstree -s $$; else echo hello; fi'
init───lightdm───lightdm───init───konsole───bash───pstree
$ ksh -c 'if [[ -n foo ]]; then pstree -s $$; else echo hello; fi'
init───lightdm───lightdm───init───konsole───bash───pstree
$ bash -c 'if [[ -n foo ]]; then pstree -s $$; else echo hello; fi'
init───lightdm───lightdm───init───konsole───bash───bash───pstree
Mas essa observação é apenas uma observação, baseada nas versões desses shells que eu tenho instalado, então YMMV:
$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu)
$ ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
$ bash --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)