Кажется, что расширение и замена взаимозаменяемы в одном и том же контексте в языке программирования оболочки. Например, некоторые документы, такие как справочное руководство Bash , Bash Hackers Wiki, используют слово «расширение» для объяснения « расширения параметров оболочки ». Однако некоторые другие документы, похоже, предпочитают слово «замена». Advanced Bash-Scripting Guide использует подстановку параметров .
Есть ли разница между «расширением» и «заменой» с точки зрения терминологии программирования оболочки?
shell-script
terminology
MS.Kim
источник
источник
variable expansion
,command substitution
. В чем вы сомневаетесь?man sh
иman set
. И когда у вас есть все это, вы делаете специфические для оболочки документы.Ответы:
Подстановка почти синонимична расширению в этом контексте, потому что их значения перекрываются. Ни одна из них не является достаточно полной подкатегорией другой, хотя в разделе руководства GNU, на который вы ссылаетесь, есть замены, которые рассматриваются как часть общего расширения.
Расширение извлекает значение идентификатора. Например, если
this=that
, когда мы расширяемся,this
мы получаемthat
. Расширение, которое не включает подстановку, предопределено тем, что используемое значение уже существует и должно быть просто извлечено, хотя это включает в себя объединение извлеченных / явных значений (например, с «арифметическим расширением»).Замещение создает значение как результат явной операции ввода / вывода. Например, если
this=$(foo bar)
,this
является результатом выполненияfoo bar
и захвата его вывода. 1 Хотя значение, полученное в результате подстановки, может быть полностью предсказуемым, оно отличается от значения, полученного при обычном расширении, поскольку оно фактически не существует до тех пор, пока не произойдет подстановка - оно произведено.Замены бывают двух видов: команда и процесс , которые являются симметричными:
«Команда» в первом - это
ls
, как и «процесс» во втором. Мы можем сказать, что то, что подставляется, на самом деле является концом трубы. Замена процесса перекрывается с перенаправлением . Тем не менее, это, пожалуй, слишком узкое техническое ограничение, которое подводит нас к сноске ...foo bar
в этом случае может быть внутренняя функция оболочки, и в этом случае отсутствует межпроцессный ввод-вывод. Существование встроенных оболочек менее очевидно скрывает эту разницу. С точки зрения содержания вход и выход будут одинаковыми.источник
Я думаю, что разница, как правило, слишком минимальна, чтобы ее можно было заметить - и эти термины часто используются взаимозаменяемо. Хотя, если вы посмотрите на этих двух случаях, вы можете видеть , что в первом примере мы заменителя
$1
для$2
в результате расширения в$2
. Как только$2
невозможно расширить, нет замены.Златовласка делает хорошее замечание о эфирном существовании замен. Вроде как кот Шредингера, наверное. Это напомнило мне о чем-то. Возможно, вы не знакомы с этой формой раскрытия параметров, указанной в POSIX, но она работает в некотором роде противоположной приведенной выше форме:
Теперь иногда я хочу того же поведения, но за
set
ценность. POSIX не определяет это поведение для чего-либо точно. Но с помощью хитрости или двух, это просто удалось:Но:
источник