Как и в случае с клиентом ftp, если пользователь не укажет имя удаленного хоста в командной строке, сценарий предложит ввести его. Если сценарий вызван командой mysftp remotehost, в качестве имени хоста будет использоваться remotehost.
Давайте посмотрим, что случится, если вызвать этот сценарий и программу sftp без аргументов командной строки. В листинге 4.10 показана попытка запустить программу sftp.
Листинг 4.10.Попытка запустить утилиту sftp без аргументов приводит к появлению малопонятной справочной информации
$ sftp
usage: sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
··········[-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
··········[-o ssh_option] [-P port] [-R num_requests] [-S program]
··········[-s subsystem | sftp_server] host
······ sftp [user@]host[: file…]
······ sftp [user@]host[: dir[/]]
······ sftp −b batchfile [user@]host
В целом это правильно, но выглядит непонятно. Напротив, сценарий mysftp позволяет продолжить и установить соединение, как показано в листинге 4.11.
Листинг 4.11.Попытка запустить сценарий mysftp без аргументов выглядит намного понятнее
$ mysftp
User account: taylor
Remote host: intuitive.com
Connecting to intuitive.com…
taylor@intuitive.com's password:
sftp> quit
Вызовите сценарий, указав имя удаленного хоста, как при использовании обычной программы ftp, и он предложит ввести только учетные данные (как показано в листинге 4.12), а затем скрытно вызовет sftp.
Листинг 4.12.Запуск сценария mysftp с единственным аргументом: именем хоста для подключения
$ mysftp intuitive.com
User account: taylor
Connecting to intuitive.com…
taylor@intuitive.com's password:
sftp> quit
Усовершенствование сценария
Когда есть такой сценарий, неизбежно возникает вопрос, можно ли создать на его основе инструмент автоматизированного резервного копирования или синхронизации. И действительно, mysftp — отличный кандидат на эту роль. В рамках такого усовершенствования можно было бы определить каталог в вашей системе, затем написать сценарий-обертку, создающий ZIP-архив важных файлов в этом каталоге, и использовать mysftp для копирования архива на сервер или в облачное хранилище. Все перечисленное мы и попробуем реализовать в сценарии № 72, в главе 9.
Некоторые версии grep предлагают широкий диапазон возможностей, включая особенно полезный вывод контекста (одна-две строки выше и ниже), окружающего найденную в файле строку. Кроме того, некоторые версии grep подсвечивают фрагмент строки, совпавший с указанным шаблоном (по крайней мере для простых шаблонов). Возможно, у вас уже есть такая версия grep. Но возможно, и нет.
К счастью, если реализовать эти функции в сценарии командной оболочки, они будут доступны даже в старых коммерческих системах Unix с относительно примитивной командой grep. Чтобы определить количество строк контекста выше и ниже совпадения, передайте сценарию флаг −c value и шаблон для поиска. Этот сценарий (представлен в листинге 4.13) также заимствует ANSI-последовательности управления цветом из сценария № 11 в главе 1 для подсветки совпавшего фрагмента.
Листинг 4.13.Сценарий cgrep
··#!/bin/bash
··# cgrep −grep с поддержкой вывода контекста и подсветкой совпадения
··context=0
··esc="^["
··boldon="${esc}[1m" boldoff="${esc}[22m"
··sedscript="/tmp/cgrep.sed.$$"
··tempout="/tmp/cgrep.$$"
··function showMatches
··{
····matches=0
····echo "s/$pattern/${boldon}$pattern${boldoff}/g" > $sedscript
····for lineno in $(grep −n "$pattern" $1 | cut −d: −f1)
····do
······if [$context −gt 0]; then
········prev="$(($lineno — $context))"
········if [$prev −lt 1]; then
··········# Чтобы исключить ошибку "invalid usage of line address 0."
··········prev="1"
········fi
········next="$(($lineno + $context))"
········if [$matches −gt 0]; then
··········echo "${prev}i\\" >> $sedscript
··········echo "-" >> $sedscript
········fi
········echo "${prev},${next}p" >> $sedscript
······else
········echo "${lineno}p" >> $sedscript
······fi
······matches="$(($matches + 1))"
····done
····if [$matches −gt 0]; then
Читать дальше