É bem sabido que ao executar bash -c "COMMAND"
(pelo menos nas versões comuns do Linux) quando há um único comando sem nenhum metacaractere (exceto space , tab ou newline ), o bash -c
processo não irá bifurcar, mas sim substituir-se executando COMMAND
diretamente com execve
a chamada do sistema para otimização, então o resultado será apenas um processo.
$ pid=$$; bash -c "pstree -p $pid"
bash(5285)───pstree(14314)
Se houver algum metacaractere (como redirecionamento) ou mais de um comando (que requer um metacaractere de qualquer maneira), bash
será bifurcado para cada comando executado.
$ pid=$$; bash -c ":; pstree -p $pid"
bash(5285)───bash(28769)───pstree(28770)
$ pid=$$; bash -c "pstree -p $pid 2>/dev/null"
bash(5285)───bash(14403)───pstree(14404)
Este é um recurso de otimização não documentado (o que significa que não é garantido) ou está documentado em algum lugar e garantido?
Nota: Presumo que nem todas as versões bash
se comportem assim e que em algumas versões que o fazem, é apenas considerado um detalhe de implementação e não garantido, mas gostaria de saber se talvez existam pelo menos algumas bash
versões que suportem explicitamente isso e documentem a condição por esta. Por exemplo, se houver um único ;
caractere após o comando, sem nenhum segundo comando, bash
ainda execve
não haverá bifurcação.
$ pid=$$; bash -c "pstree -p $pid ; "
bash(17516)───pstree(17658)
Antecedentes da minha pergunta
Como mencionei, esse comportamento é bastante conhecido 1 2 por bash
usuários experientes e estou familiarizado com ele há muito tempo.
Alguns dias atrás, encontrei o seguinte comentário no shell bash interativo: Defina o diretório de trabalho por meio de opções de linha de comando onde @dave_thompson_085 escreveu:
bash
executa automaticamente (ou seja, substitui-se por) o último (ou único) comando em-c
.
Eu respondi que isso só é verdade se houver um único comando. Mas então me perguntei: existem algumas versões em bash
que talvez o último comando seja exec
ed e não bifurcado, mesmo que haja outro comando antes dele? E em geral, há casos em que esse comportamento é garantido? Certas bash
versões expõem (e elaboram) esse recurso fora do código-fonte?