Подстановка почти синонимична расширению в этом контексте, потому что их значения перекрываются. Ни одна из них не является достаточно полной подкатегорией другой, хотя в разделе руководства GNU, на который вы ссылаетесь, есть замены, которые рассматриваются как часть общего расширения.
Расширение извлекает значение идентификатора. Например, если this=that
, когда мы расширяемся, this
мы получаем that
. Расширение, которое не включает подстановку, предопределено тем, что используемое значение уже существует и должно быть просто извлечено, хотя это включает в себя объединение извлеченных / явных значений (например, с «арифметическим расширением»).
Замещение создает значение как результат явной операции ввода / вывода. Например, если this=$(foo bar)
, this
является результатом выполнения foo bar
и захвата его вывода. 1 Хотя значение, полученное в результате подстановки, может быть полностью предсказуемым, оно отличается от значения, полученного при обычном расширении, поскольку оно фактически не существует до тех пор, пока не произойдет подстановка - оно произведено.
Замены бывают двух видов: команда и процесс , которые являются симметричными:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
«Команда» в первом - это ls
, как и «процесс» во втором. Мы можем сказать, что то, что подставляется, на самом деле является концом трубы. Замена процесса перекрывается с перенаправлением . Тем не менее, это, пожалуй, слишком узкое техническое ограничение, которое подводит нас к сноске ...
foo bar
в этом случае может быть внутренняя функция оболочки, и в этом случае отсутствует межпроцессный ввод-вывод. Существование встроенных оболочек менее очевидно скрывает эту разницу. С точки зрения содержания вход и выход будут одинаковыми.
variable expansion
,command substitution
. В чем вы сомневаетесь?