Parece que você gostaria de ter um analisador de sintaxe e um analisador de shell que gerem os tokens encontrados e as ações que ele executa ao longo do caminho para executar o comando real.
Não tenho conhecimento de nenhum shell que faça isso, pois isso desaceleraria o processamento imensamente, além de produzir uma enorme quantidade de saída para cada comando, mesmo que um pouco complexo.
Com bash
, se você compilar o shell você mesmo com a macro DEBUG
definida e se você habilitar todas as chamadas comentadas para a função itrace()
no código fonte do shell 1 , então você pode obter um pouco do que você está querendo ver:
bash-4.4$ if [[ "$BASHPID" = 10 ]] && [[ "$USER" = myself ]]; then echo hello me; fi
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $BASHPID"
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $USER"
TRACE: pid 22914: param_expand: '$BASHPID' pflags = 0
Aqui, você pode ver o analisador emitindo algumas instruções de depuração sobre como localizar aspas duplas e variáveis de abertura e fechamento. Posteriormente, outra etapa de processamento nos informa que uma expansão de parâmetro de $BASHPID
é executada, mas longe de todas as etapas estão listadas.
Este tipo de saída de depuração de bash
é mais útil para pessoas realmente envolvidas com a escrita e modificação do código-fonte do shell, e definitivamente não tem a intenção de servir como uma forma de entender a interpretação e a interpretação de suas entradas.
Para se familiarizar mais com o funcionamento da sintaxe e da gramática do shell, sugiro começar em a definição POSIX da gramática do shell (que é bastante complexa e mais ou menos insignificante para quem não consegue ler EBNF ).
1 Exceto por um em lib/glob/glob.c
que possui um erro de sintaxe.