В вычислении , команда подстановки представляет собой механизм , который позволяет команду для запуска и его выход , чтобы быть вставлен обратно в командной строке в качестве аргументов другой команды. Подстановка команд впервые появилась в Bourne оболочке , [1] введено с версией 7 Unix в 1979 году, и остался характерной для всех последующих Unix оболочек . С тех пор эта функция была принята и на других языках программирования , включая Perl , PHP , Ruby и Microsoft Powershell под Windows . Он также появляется в MicrosoftCMD.EXE в FOR
команде и в ( )
команде.
Синтаксис и семантика
Оболочки обычно реализуют подстановки команд, создавая дочерний процесс , чтобы запустить первую команду с ее стандартным выводом поступает обратно к корпусу, в котором говорится , что выход, разбор его в слова , разделенных пробелами . Поскольку оболочка не может знать, что у нее есть все выходные данные дочернего элемента, пока канал не закроется или дочерний элемент не умрет, она ждет до этого момента, прежде чем запустить другой дочерний процесс для выполнения второй команды.
Это C оболочки пример показывает , как можно осуществлять поиск всех C файлов , содержащих строку malloc
, используя fgrep
и затем редактировать любые , которые находятся с помощью vi
редактора. Синтаксическая нотация, показанная здесь, `
... `
с использованием обратных кавычек в качестве разделителей , является исходным стилем и поддерживается всеми распространенными оболочками Unix.
#! / bin / CSH
VI ` fgrep -l таНос * .c `
Возражения были вызваны как синтаксисом , как он типизирован, так и семантикой , как это работает.
Несмотря на то, что его легко набирать, что является важным фактором для интерактивного командного процессора, синтаксис критиковался как неудобный для вложения, помещая одну подстановку команды внутрь другой, потому что левый и правый разделители одинаковы. [2] KornShell (КШ) [3] решил эту проблему с альтернативной нотацией, $(
... )
, заимствованием из обозначений стиля , используемого для подстановки переменной . Сегодня большинство оболочек UNIX поддерживают этот синтаксис. Microsoft PowerShell также использует эту нотацию с той же семантикой.
#! / bin / bash
vi $ ( fgrep -l malloc * .c )
Семантика, разбивающая вывод на слова через пробелы, также подвергалась критике. Он хорошо работал в ранних системах Unix , где имена файлов никогда не содержали пробелов, но он совсем не работает в современных системах Windows и Linux , где имена файлов определенно могут содержать пробелы. [4] В любом из этих предыдущих примеров, если какое-либо из имен файлов, соответствующих *.c
подстановочному знаку, содержит пробел, это имя файла будет разбито на два отдельных аргумента vi
, явно не то, что было задумано. Оболочка Hamilton C решила эту проблему с помощью записи с двойными кавычками, ``
... ``
, которая разбирает слова только при переносе строки. [5]
Это пример подстановки команд с помощью ()
оператора в PowerShell :
$ MyVariable = ( ls ) echo $ MyVariable
Замена выражения
Связанная с этим возможность, подстановка выражений, находится в языках Common Lisp и Scheme , вызывается с помощью оператора запятой в выражении, помеченном оператором обратной кавычки (или «квазицитат»), а в ABC с помощью выражения, заключенного между обратные кавычки внутри текстового дисплея ( строковый литерал ). Например, команда ABC WRITE '2 + 2 = `2+2`'
дает результат 2 + 2 = 4 .
Смотрите также
Рекомендации
- ^ Дахда, Ховард. Азия языков программирования: оболочка Bourne, или sh, Углубленное интервью со Стивом Борном, создателем оболочки Bourne, или sh , Computerworld, 5 марта 2009 г.
- ^ Unix Power Tools: 45.31 Подстановка вложенных команд.
- ^ Розенблатт, Билл; Арнольд Роббинс (2002). Изучение оболочки Корна (2-е изд.). O'Reilly Media, Inc. стр. 127. ISBN 978-0-596-00195-7. Проверено 20 июля 2010 .
Синтаксис подстановки команд: выполняется
$(Unix command)
команда, заключенная в круглые скобки, и все, что команда записывает в стандартный вывод (и в стандартную ошибку), возвращается как значение выражения. - ^ Джонсон, Крис (2009), «8», Pro Bash Programming: Scripting the Linux Shell , New York, NY: Springer-Verlag New York, Inc., стр. 84 , получено 19 декабря 2014 г. ,
Имена файлов, содержащие пробелы, являются мерзостью, но в наши дни они настолько распространены, что сценарии должны учитывать их возможность (или я должен сказать неизбежность?). ... Результат подстановки команды подвержен разбиению на слова
- ^ Руководство пользователя оболочки Hamilton C: Перенаправление ввода-вывода: подстановка команд , Hamilton Laboratories, заархивировано из оригинала 19 декабря 2014 г. , получено 19 декабря 2014 г.