Замена команды
Эта статья предоставляет недостаточный контекст для тех, кто не знаком с предметом . ( Март 2023 г. ) |
В вычислительной технике подстановка команд — это средство, позволяющее запустить команду и вставить ее выходные данные обратно в командную строку в качестве аргументов другой команды. Подстановка команд впервые появилась в оболочке Bourne , [1] представлен в версии 7 Unix в 1979 году и остается характерной чертой всех более поздних оболочек Unix . С тех пор эта функция была принята в других языках программирования и , включая Perl , PHP , Ruby от Microsoft и Powershell под Windows . Он также появляется в Microsoft CMD.EXE в FOR
команда и ( )
команда.
Синтаксис и семантика
[ редактировать ]Оболочки обычно реализуют подмену команд, создавая дочерний процесс для запуска первой команды со стандартным выводом , передаваемым обратно в оболочку, которая считывает этот вывод, анализируя его на слова, разделенные пробелами . Поскольку оболочка не может знать, что у нее есть все выходные данные дочернего процесса, пока канал не закроется или дочерний процесс не умрет, она ждет до тех пор, прежде чем запустить другой дочерний процесс для запуска второй команды.
В этом примере оболочки C показано, как можно найти все файлы C, содержащие строку malloc
с использованием fgrep
а затем отредактируйте все найденные с помощью vi
редактор. Синтаксические обозначения, показанные здесь, `
... `
, использующий обратные кавычки в качестве разделителей , является оригинальным стилем и поддерживается всеми распространенными оболочками Unix.
#!/bin/csh
vi `fgrep -l malloc *.c`
Возражения были высказаны как против синтаксиса , как он типизирован, так и против семантики , как он работает.
Хотя этот синтаксис легко набирать, что является важным фактором для интерактивного командного процессора, его критиковали за то, что его неудобно вкладывать, помещая одну замену команды в другую, поскольку левый и правый разделители одинаковы. [2] КорнШелл ) (кш [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
.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Дада, Ховард. «AZ языков программирования: оболочка Bourne, или sh. Углубленное интервью со Стивом Борном, создателем оболочки Bourne, или sh». Архивировано 17 марта 2010 г. в Wayback Machine , Computerworld , 5 марта 2009 г.
- ^ «Unix Power Tools: 45.31 Замена вложенных команд» . Архивировано из оригинала 12 мая 2023 г. Проверено 17 марта 2010 г.
- ^ Розенблатт, Билл; Арнольд Роббинс (2002). Изучение Korn Shell (2-е изд.). О'Рейли Медиа, Инк. с. 127. ИСБН 978-0-596-00195-7 . Архивировано из оригинала 22 мая 2024 г. Проверено 20 июля 2010 г.
Синтаксис подстановки команд:
$(Unix command)
Команда внутри круглых скобок запускается, и все, что команда записывает в стандартный вывод (и в стандартную ошибку), возвращается как значение выражения. - ^ Джонсон, Крис (2009), «8», Программирование Pro Bash: создание сценариев для оболочки Linux , Нью-Йорк, Нью-Йорк: Springer-Verlag New York, Inc., стр. 84, ISBN 9781430219989 , заархивировано из оригинала 22 мая 2024 г. , получено 19 декабря 2014 г. Имена
файлов, содержащие пробелы, — это мерзость, но в наши дни они настолько распространены, что сценарии должны учитывать их возможность (или лучше сказать неизбежность?). ... Результат подстановки команд подлежит разбиению слов
- ^ Руководство пользователя оболочки Hamilton C: Перенаправление ввода-вывода: замена команд , Hamilton Laboratories, заархивировано из оригинала 19 декабря 2014 г. , получено 19 декабря 2014 г.