Підстановка команди

Підстановка команди - це можливість команди виконуватись так, що її вихідні дані повертаються в командний рядок аргументами для наступної команди. Функція підстановки вперше з’явилося в оболонці Борна[1] разом з Version 7 Unix у 1979 році і з того часу залишилась однією з характеристик оболонок Unix і розповсюдилась в інших мовах програмування таких, як Perl, PHP, Ruby i Powershell для Windows. Також зустрічається в CMD.EXE в командіFORта( )

Синтаксис та семантика

Оболонки типово використовують підстановку команди, створюючи дочірний процес для виконання першої команди зі стандартного потоку виводу, що приєднаний до тої ж оболонки, що читає цей вивід, синтаксично аналізуючи його і розділяючи пробілом слова.

Наступний приклад на C shell показує можливість пошуку всіх файлів з розширенням .c, які містять в собі рядок malloc , реалізовану командою fgrep, і їх редагування, використовуючи редактор vi. Синтаксична нотація ` ... ` представлена гравісом та розділювальними символами - оригінальний синтаксис, який підтримується й іншими Unix оболонками.

#!/bin/csh
vi `fgrep -l malloc *.c`

Як синтаксис (написання команди), так і семантику (механізм роботи) не схвалювали. Легкість в написанні не забезпечувала основного найважливішого фактору для інтерактивного командного процесору. Синтаксис критикували за незручність вкладення однієї підстановки команди всередині іншої, тому що і лівий, і правий розділювальні символи були однаковими.  KornShell (ksh) вирішив це альтернативною нотацією, $( ... ) взявши за приклад стиль підстановки змінних. Сьогодні більшість Unix (і не тільки, в тому числі Powershell від Microsoft ) оболонок підтримують такий синтаксис.

#!/bin/bash
vi $(fgrep -l malloc *.c)

Семантику та розбиття виводу на слова пробілами також критикували. Вона працювала справно в ранніх версіях Unix систем, де пробіли не використовувались в назвах файлів, але зовсім некоректно на сучасних Windows i Linux системах, де пробіли тепер можуть використовуватись. В будь-якому з прикладів вище, якщо будь-яка з назв файлів, що збігається з байдужим символом *.с, містить пробіл.[2] , то vi розіб’є її на два окремі аргументи і це не той результат, який очікується.  Hamilton C shell вирішив цю проблемою подвійними гравісами,`` ... `` що розділяє на слова лише при розривах стрічки.[3] Це приклад підстановки команди з використанням оператора () в PowerShell:

$MyVariable = (ls)
echo $MyVariable

Підстановка виразу

Пов’язана з даною можливість, підстановки виразу, часто зустрічається в Common Lisp та Scheme в ABC, використовуючи вираз, взятий в гравіси всередині текстового виводу (рядкового літералу). Наприклад, ABC команда WRITE '2 + 2 = `2+2`' виведе 2 + 2 = 4.

Див. також

Посилання

  1. IT news, careers, business technology, reviews. Computerworld (англ.). Архів оригіналу за 4 Березня 2016. Процитовано 14 січня 2022.
  2. Johnson, Chris (2009), 8, Pro Bash Programming: Scripting the Linux Shell, New York, NY: Springer-Verlag New York, Inc., с. 84, архів оригіналу за 14 Січня 2022, процитовано 19 грудня 2014, File names containing spaces are an abomination, but they are so common nowadays that scripts must take their possibility (or should I say inevitability?) into account. ... The result of command substitution is subject to word splitting
  3. Hamilton C shell User guide: I/O redirection: Command substitution, Hamilton Laboratories, архів оригіналу за 19 грудня 2014, процитовано 19 грудня 2014