Responda primeiro
- O script init não tem nada a ver com o valor de retorno.
- A substituição do processo
<(...) é a causa real.
Explicação
[Proof1] Agora, tente este comando abaixo. Não tem opção --init-file , mas a mesma saída (com algumas impressões triviais).
(exit 10)
bash <( echo "type blah; echo $?" )
[Proof2] Tente seguir os comandos e altere o número no primeiro, você encontrará um valor de retorno diferente.
(exit 117)
bash --init-file <( echo "type blah; echo $?" )
[Proof3] Qual saída você vê?
(exit 23)
cat <( echo "type blah; echo $?" )
Eu acho que você pode entender a Answer1 através das 3 provas acima. E quanto a Answer2?
Se você apenas digitar o comando simples echo "type blah; echo $?" para executá-lo, qual resultado você espera? Você espera que ele imprima type blah; echo <num> , dos quais <num> é o valor de retorno do último comando. Certo? Nós todos sabemos que o $? será substituído por um número, porque todos sabemos que o bash executará a expansão dos parâmetros em $? .
É o mesmo em processo de substituição <(...) .
No Bash, os comandos que aparecem em uma substituição de processo <(...) serão invocados em um subshell. Subshell também é um shell (Bash). Assim, para o comando echo "type blah; echo $?" , você obterá exatamente o mesmo resultado em subshell que você executará diretamente no shell atual, o que significa que o subshell também executará a expansão de parâmetro em $? , da mesma forma que um bash faz.
Portanto, quando você estiver executando bash --init-file <(echo "type blah; echo $?") , o conteúdo do arquivo de script init será realmente type blah; echo <num> , em vez de type blah; echo $? .
Mais profundo
Embora na substituição de processo <(echo "type blah; echo $?") o $? seja expandido por subshell, seu valor é afetado pelo shell atual. O valor de ? na subshell é o mesmo que o da shell atual.
Veja o Proof2, o primeiro comando é (exit 117) , o que faz com que o valor de $? no shell atual seja 117. Mas ele é expandido para 117 em subshell também.
Isso ocorre porque os comandos que aparecem na substituição de processo <(...) são invocados em um ambiente de subshell que é uma duplicata do ambiente de shell atual.
Então, isso explica em sua pergunta que você mostrou um valor de retorno diferente se colocar a opção -i no comando. Essa não é a diferença trazida pela opção -i . Isso porque antes desse comando, você definitivamente executa outro comando que retorna 2.
Mais palavras
Na verdade, existem três outras formas trabalhando da mesma maneira que a substituição de processos no bash.
- Substituição de comando
$(...) ou '...'
- Comandos agrupados com parênteses
(...)
- Comandos incorporados no pipeline
<builtin cmd> | ... ou ... | <builtin cmd> ou <builtin cmd> | <builtin cmd>