ПОЯСНЕНИЯ
В строках 4-8 выполняется проверка на ошибки. Поскольку cuchk не имеет никаких опций, в командной строке не должно быть никаких параметров. Если параметры присутствуют, это считается ошибкой. Строки 10-15 организуют вечный цикл while. Обратите внимание, что амперсанд в строке 15 автоматически запускает cuchk в фоновом режиме, ведь нет никакого резона выполнять эту программу в приоритетном режиме.
В строке 12 выполняется команда "ps -e", которая выдает информацию о состоянии всех значительных пользовательских процессов. Эти данные пропускаются по конвейеру через fgrep. Утилита fgrep ищет наличие символов "cu". Мы надеемся, что эти символы соответствуют только процессам cu, которые мы ищем. Они могут, однако, относиться к чему-то совершенно неожиданному, например "picuser" или к какому-то аналогично построенному имени. Результат работы команды fgrep направляется на устройство /dev/null, чтобы избавиться от лишней информации. Нас интересует только статус завершения команды fgrep. Он сообщает нам, найдено ли вхождение символов "cu" или нет.
В конце строки 12 присутствует символ обратной косой черты, указывающий интерпретатору shell, что следующая физическая строчка является на самом деле частью той же самой программной строки и что нужно добавить ее к строке 12, а не выполнять самостоятельно. Разбиение длинных строк на несколько меньших строк с помощью символов обратной косой черты позволяет нам получать красиво оформленный, более наглядный исходный код.
Строка 13 выполняется в том случае, если fgrep отработала успешно (т.е. если она выдает нулевой статус завершения). Это означает, что символы "cu" найдены, а значит процесс cu работает и в настоящее время не доступен. Поэтому процесс cuchk засыпает на 5 секунд. Когда он пробуждается, выполнение продолжается со строки 10, возобновляется вечный цикл и проверка процессов продолжается. Если fgrep не находит символы "cu" (возвращается ненулевой статус завершения), то выполняется строка 14, которая выдает сообщение о том, что программа cu свободна, и работа программы завершается. Таким образом, мы сразу же знаем, что линия cu открыта для использования, поэтому мы можем поскорее занять ее.
В строках 4-6 устанавливаются действия, выполняемые программой talk по умолчанию. Эти действия можно полностью изменить путем редактирования исходного файла. Главное достоинство этих умолчаний в том, что если такую конфигурацию вы используете чаще всего, то вам достаточно просто ввести "talk", без всяких опций.
Строка 4 инициализирует переменную BAUD значением 1200, это значение по умолчание для скорости модема. Строка 5 присваивает переменной TTY значение tty11, что соответствует первому последовательному порту аппаратуры. Обычно нужно tty00, но SCO XENIX имеет виртуальную консоль, причем tty02-tty10 являются отдельными экранами, доступ к которым осуществляется с одного консольного устройства. Если это не так в вашей системе, укажите здесь правильное значение TTY. В строке 6 переменная PIPE инициализируется пустой строкой, так как конвейер применяется для протоколирования данных, а по умолчанию захват данных не выполняется.
Строки 8-24 представляют собой цикл, который перебирает все аргументы командной строки. В строках 10-23 используется оператор выбора среди опций для выполнения требуемых функций. Строка 11 проверяет, начинается ли данная опция с символов -b, после которых следует что-то еще. Если да, то символы, следующие после -b, вырезаются и заносятся в переменную BAUD. Обратите внимание, что именно поэтому вы должны набирать "-b2400", а не "-b 2400".
В строке 12 проверяется, хотите ли вы включить протоколирование. Если да, то на экран выводится имя протокольного файла, а переменная PIPE устанавливается так, чтобы направить стандартный вывод по конвейеру программе tee системы UNIX. Программа tee - это универсальная конвейерная программа расщепления, которую можно использовать для посылки копии потока данных в определенный пункт назначения, не воздействуя на основной конвейер. В данном случае мы применяем программу tee для посылки данных, проходящих через последовательный порт, на экран и в наш регистрационный файл /tmp/talk/.$$. (Если вы представите себе водяную трубу с T-образным стыком, то поймете, что происходит.)
Строка 14 проверяет, начинается ли опция с -t. Если это так, то вырезается номер терминала. Здесь можно передать любое значение tty, но не забывайте, что этот номер tty должен также присутствовать в файле /usr/lib/uucp/L-devices. Благодаря этому файлу, программа cu знает, что терминальное устройство подключено к разрешенному порту. В строке 15 проверяется, собираетесь ли вы подключаться к системе UNIX напрямую. Если да, скорость обмена автоматически устанавливается на 9600 бод в целях повышения пропускной способности терминала.
Строки 16-22 выполняют проверку ошибок. Если какая-либо опция, переданная в командной строке, не соответствует никакому из предыдущих образцов оператора case, этот факт фиксируется здесь, выдаются сообщения об ошибках и командный файл завершается. Строка 26 - это волшебная строка. Поскольку все shell-переменные получили свои значения, мы можем использовать их в командной строке, чтобы подставить в нее необходимые значения. Сначала применяется команда eval. Она раскрывает все имена переменных, заменяя их на соответствующие значения.
В данном случае мы формируем полную командную строку утилиты cu: скорость берется из переменной BAUD, линия из TTY, а подсоединение прямое. Если мы не ведем протоколирование данных, значение PIPE нулевое и оно будет отброшено при синтаксическом разборе. Если же переменная PIPE содержит команду для отправки данных в протокольный файл, команда eval обеспечивает это, организовывая такой конвейер, как мы указали.
Uust является однопроходной утилитой, т.е. не имеет внутренних циклов. Вы выбираете опцию, и после завершения ее выполнения завершается весь командный файл. Таким способом это сделано главным образом по той причине, что вы должны обрывать вывод команды tail, коорая используется некоторыми опциями меню. Однако, клавиша break прекращает все, даже выполнение uust. Не имеет смысла делать внутренний цикл, так как этот цикл редко смог бы повториться. В строках 4-8 выполняется проверка командной строки на наличие ошибок. Если переданы какие-то аргументы, выдается сообщение об ошибке и командный файл завершается.
Строка 10 инициализирует переменную UUNODE текущим именем uucp той системы, в которой вы работаете. Это обеспечивается вызовом утилиты uuname.
Строки 11-24 отображают главное меню одним большим оператором echo. Имя системы, поступившее в переменную UUNODE, выдается для справки в правой верхней части экрана.
В строке 25 читается ответ пользователя, а строки 27-66 проверяют команду и выполняют ее. Если вы ввели только возврат каретки, это соответствует строке 28, и программа завершается. Строки 29-38 обрабатывают команду 'c' - подключение в отладочном режиме. Запрашивается имя системы и проверяется, не пустое ли оно. Если оно пустое, командный файл завершается. В противном случае строка 34 сообщает, что uust пытается удалить все файлы STST, которые создавались при неудачных вызовах. Перед тем как обратиться к системе, вы должны удалить все файлы STST. Если таких файлов нет, команда rm не срабатывает и выдается сообщение "no STST files".
Строки 39-40 выполняют опцию 'd'. Сначала отображается для справки название каталога, который мы просматриваем. Затем распечатывается каталог PUBDIR в длинном формате. Заметим, что LOGNAME соответствует любому пользователю, запустившему данную программу, поэтому нет необходиvости вписывать в текст программы какое-то значение.
В строках 41-42 аналогичным образом обрабатывается опция 'f'. Мы распечатываем здесь каталог подкачки.
Команда 'l' в строках 43-44 сообщает, что отображается регистрационный файл. Затем используется команда "tail -f". Опция -f означает, что нужно производить отображение того, что находится в файле следующим образом: как только транзакции печатаются в файл, они отображаются на ваш экран. Пользователь должен нажать клавишу break для выхода из программы.
Строки 45-58 выполняют команду 'r', которая пытается произвести повторное подключение. Сначала запрашивается имя системы и сравнивается с пустой строкой. Если имя введено, мы пытаемся удалить файлы STST и выдаем сообщение о том, было ли это удаление успешным. Затем печатается сообщение о том, что запускается процесс uusub. В строке 54 проверяется, является ли корневым файлом XENIX. Если это так, то утилита uusub вызывается с учетом ее нового местонахождения в системе XENIX. В противном случае она вызывается с указанием ее обычного местонахождения - /usr/lib/uucp. После выполнения uusub отображается динамический хвост регистрационного файла, пока пользователь не нажмет клавишу break, после чего командный файл завершается.
В строках 59-60 выполняется проверка сводки о транзакциях. Используется команда uulog, ей передается LOGNAME текущего пользователя. Подробности о команде uulog можно найти в документации. Опция 'u' рассматривается в строках 61-62. Сначала отображается команда rm, которая будет выполнена, чтобы уведомить об этом пользователя. Затем эта команда выполняется, чтобы попытаться удалить файлы блокировки. Если команда удаления завершается неудачей, выдается сообщение об ошибке, указывающее на отсутствие файлов блокировки.
Строки 63-64 запускают опцию 'w', чтобы посмотреть деятельность uucp за последнюю неделю. С помощью команды more печатается файл LogWEEK. Этот файл создается утилитой uucp, чтобы обеспечить сжатую сводку о работе в течение недели.
Строка 65 соответствует любым командам, которые не были распознаны ранее. Такие команды являются ошибочными, и выдается сообщение об этом. Когда выполнение программы доходит до этого места, она завершается.
Строки 4-8 проверяют наличие ошибок. Если в командной строке есть аргументы, печатается сообщение об ошибке.
Строка 10 инициализирует переменную SELF именем вашего системного узла, используемого утилитой uucp.
Строки 12-16 запрашивают каталог-источник и читают ответ в переменную SOURCE. Если ничего не введено или указан не каталог, программа завершается. Строки 18-21 запрашивают систему-адресат и каталог-адресат. Умолчаниями являются ваша собственная система и каталог PUBDIR для размещения файлов. Эти умолчания облегчают конфигурирование, связанное с пересылкой информации, чтобы не было необходимости вводить много данных.
В строках 23 и 24 проверяется, инициализированы ли переменные.
Если переменной SYSTEM присвоен возврат каретки, в нее заносится значение SELF. Если переменная DEST пустая, ей присваивается ~/$LOGNAME. Эти операторы устанавливают значения по умолчанию. Строка 26 печатает сообщение о том, что файлы ставятся в очередь. Весь фокус заключается фактически в строках 28-32. Команда find начинает работать с каталога SOURCE и находит все обычные файлы. Этот список передается утилите sort, так что uucp пересылает файлы в отсортированном порядке. Это облегчает отслеживание того, какие файлы были переданы, если возникают какие-то проблемы.
Отсортированный список попадает в цикл while, читающий имена файлов. Каждое имя отображается на экран для справки, и файл ставится в очередь к удаленной системе. В строке 31 указаны такие опции uucp: -r для постановки в очередь, -c для того, чтобы не копировать файлы в каталог подкачки, и -d для создания каталогов, необходимых в удаленной системе.
Для поддержки древовидной структуры мы применяем магический синтаксис $SYSTEM!$DEST/$FILE. Нам нужно не только скопировать файлы в систему и в каталог, но и определить маршрутное имя вплоть до самого файла. Это гарантирует, что файлы будут расфасованы по каталогам. Если бы был использован синтаксис $SYSTEM!$DEST, то все файлы попали бы в один каталог и их иерархическая структура была бы утеряна.
После того как все файлы поставлены в очередь, они находятся в этой очереди до тех пор, пока их не позовет удаленная система. Тогда файлы будут скопированы в эту систему.