Ответь первым
- Init-скрипт не имеет ничего общего с возвращаемым значением.
- Подстановка процесса
<(...)
является реальной причиной.
объяснение
[Доказательство1] Теперь попробуйте эту команду ниже. У него нет опции --init-file
, но тот же вывод (с некоторыми тривиальными отпечатками).
(exit 10)
bash <( echo "type blah; echo $?" )
[Proof2] Попробуйте следующие команды и измените число в первой, вы найдете более другое возвращаемое значение.
(exit 117)
bash --init-file <( echo "type blah; echo $?" )
[Proof3] Какой вывод вы видите?
(exit 23)
cat <( echo "type blah; echo $?" )
Я думаю, что вы можете понять ответ 1 через 3 доказательства выше. А как насчет Answer2?
Если вы просто наберете простую команду echo "type blah; echo $?"
запустить его, какой результат вы ожидаете? Вы ожидаете, что это напечатает type blah; echo <num>
, из которых <num>
- это возвращаемое значение последней команды. Правильно? Мы все знаем $?
будет заменено на число, потому что мы все знаем, что bash будет выполнять расширение параметров для $?
,
То же самое в подстановке процесса <(...)
.
В Bash команды, которые появляются в подстановке процесса <(...)
будут вызываться в подоболочке. Subshell также является оболочкой (Bash). Так что для команды echo "type blah; echo $?"
вы получите точно такой же результат в subshell, как и при простом запуске в текущей оболочке, что означает, что subshell также выполнит расширение параметров в $?
же, как в bash.
Итак, когда вы запускаете bash --init-file <(echo "type blah; echo $?")
содержимое файла init-script на самом деле имеет type blah; echo <num>
а не type blah; echo $?
Глубже
Хотя в процессе подстановки <(echo "type blah; echo $?")
$?
раскрывается подоболочкой, его значение зависит от текущей оболочки. Значение ?
в subshell такой же, как в текущей оболочке.
Посмотрите Proof2, первая команда (exit 117)
, которая делает значение $?
в текущей оболочке будет 117. Но он также расширен до 117 в подоболочке.
Это связано с тем, что команды, появляющиеся в подстановке процесса <(...)
, вызываются в среде подоболочки, которая является дубликатом текущей среды оболочки.
Таким образом, это объясняет, что в вашем вопросе вы указали другое возвращаемое значение, если в команде указали опцию -i
. Это не разница, внесенная опцией -i
. Это потому, что перед этой командой вы определенно выполняете другую команду, которая возвращает 2.
Больше слов
На самом деле, есть три другие формы, работающие так же, как подстановка процессов в bash.
- Подстановка команд
$(...)
или `...`
- Команды, сгруппированные в скобках
(...)
- Встроенные команды в конвейере
<builtin cmd> | ...
или ... | <builtin cmd>
или <builtin cmd> | <builtin cmd>