3?
$
Если вы хотите узнать, как команда pick
for i аргументы обрабатываются правильно. Мы могли бы написать цикл другими способами:$ grep for pick
for i in $*
$ pick '1 2' 3
1?
2?
3?
$
Эта версия не работаете поскольку операнды в цикле снова распознаются, а наличие пробелов в первом аргументе приводит к тому, что он разбивается на два аргумента. Попробуйте взять в кавычки $*
$ grep for pick
for i in "$*"
$ pick '1 2' 3
1 2 3?
$
Такая версия тоже не работает, поскольку "$*
$ grep for pick
for i in "$@" '
$ pick '1 2' 3
1 2?
3?
$
Строка $@
$*; она обрабатывается иначе, только если заключена в кавычки. Мы использовали ее в команде overwrite, чтобы сохранить аргументы для команды пользователя.В итоге мы можем сформулировать следующие правила: $*
$@ раскрываются как аргументы и снова распознаются; наличие пробелов в аргументах приводит к разбиению их на несколько аргументов;• "$*
• «$*
Если команда pick
$ pick < mailinglist
вместо
$ pick `cat mailinglist`
Но мы не будем исследовать эту версию команды pick
Первые два из приведенных ниже упражнений достаточно сложны, но полезны даже для опытных программистов, работающих на языке shell
Попробуйте написать программу pick
q? Если нет, то попытайтесь выполнить следующее упражнение.Хотя встроенные команды интерпретатора, такие, как read
set, нельзя переключить, можно временно переключить сам интерпретатор. Прочтите в справочном руководстве раздел по sh(1), в котором описывается команда exec, и придумайте, как читать из /dev/tty без вызова порожденного интерпретатора. (Может оказаться полезным сначала прочитать гл. 7.)(
read в вашем файле .profile для инициации TERM, а также всего, что зависит от нее, например позиции табуляции.5.8 Команда news
В гл. 1 упоминалось о том, что в вашей системе может быть команда news
news не для замены вашей местной команды, а чтобы показать, как легко написать такую программу на языке shell. Неплохо было бы сравнить реализацию предлагаемой здесь команды news с вашей версией.Обычно основная идея таких программ заключается в том, что отдельные фрагменты новостей хранятся по одному в файлах в специальном каталоге типа /usr/news
news сравнивает время изменения файлов в каталоге /usr/news и вашем исходном каталоге (.news_time). В целях отладки мы можем использовать каталог '.' как для файлов новостей, так и для news_time. Можно заменить его на /usr/news, когда программа будет готова для общего пользования:$ cat news