Прежде чем завершить обсуждение оператора case
ed и его производных. Действительно, наличие двух видов шаблонов означает, что нужно изучать два набора правил и иметь два программных фрагмента для их обработки. Некоторые различия вызваны просто неудачным выбором, который никогда не был зафиксирован. В частности, нет никаких причин (кроме того, что так сложилось исторически), по которым ed использует '.' а интерпретатор — '?' для задания единственного символа. Но иногда шаблоны применяются по-разному. Регулярные выражения в редакторе используются для поиска последовательности символов, которая может встретиться в любом месте строки; специальные символы и $ нужны, чтобы направить поиск с начала или конца строки. Но для имен файлов мы хотим, чтобы направление поиска определялось по умолчанию, поскольку это наиболее общий случай. Было бы неудобным задавать нечто вроде$ ls ^?*.с$
вместо
$ ls *.с
Если пользователи предпочтут вашу версию команды cal
/usr/bin?Имеет ли смысл сделать так, чтобы при обращении cal 83
Модифицируйте команду cal
$ cal oct nov
и даже диапазон месяцев:
$ cal oct-dec
Если сейчас декабрь, а вы выполняете обращение cal jan
cal?5.2 Что представляет собой команда which
При обзаведении собственными версиями команд, аналогичных cal
mary, то, вводя команду cal, получаете стандартную версию команды вместо новой, если, конечно, не установили в своем каталоге bin связь с новой командой cal. Это может привести к путанице: вспомните, что сообщения об ошибках в исходной, команде cal не очень вразумительны. Мы привели всего лишь один пример возникающих трудностей. Поскольку интерпретатор осуществляет поиск команд среди каталогов, задаваемых переменной PATH, всегда есть вероятность столкнуться не с той версией команды, которую вы ожидали. Например, если вы задали команду, скажем echo, имя выполняемого на самом деле файла будет ./echo, /bin/echo, /usr/bin/echo или какое-то другое в зависимости от компонентов вашей переменной PATH и от того, где находятся файлы. Может случиться, что в вашей последовательности поиска ранее, чем вы ожидали, окажется выполняемый файл с правильным именем, но не с теми результатами. Наиболее типичным примером в такой ситуации является команда test, которую мы обсудим позднее. Ее название настолько распространено для временной версии программы, что вызовы "не тех" команд test происходят раздражающе часто[12]. Здесь весьма полезным средством явилась бы команда, которая помогла бы выяснить, какая версия программы должна выполняться.Один из вариантов решения — цикл поиска по каталогам, указанным в PATH
for по именам файлов и аргументам. Здесь же нужен такой цикл:for i in компонента в PATH
do
если заданное имя в каталоге i
печать полного путевого имени
done
Поскольку любую команду можно запустить внутри символов слабого ударения очевидное решение состоит в том, чтобы запустить sed
PATH, заменив двоеточия на пробелы. Мы можем проверить это с помощью нашего старого друга echo:$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
$ echo $PATH | sed 's/:/ /a'
/usr/you/bin /bin /usr/bin
$ echo `echo $PATH | sed 's/:/ /g'`
/usr/you/bin /bin /usr/bin
$