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>