Книга: Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
Назад: Глава 12. Сценарии для игр и развлечений
Дальше: Глава 14. ImageMagick и обработка графических файлов

Глава 13. Работа в облаке

Одним из важнейших достижений последних десяти лет стало дальнейшее проникновение Интернета в прикладные области. В первую очередь это касается интернет-хранилищ данных. Первоначально они служили только для хранения резервных копий, но в наши дни, с распространением мобильных технологий, облачные хранилища стали все чаще заменять обычные диски. В число приложений, пользующихся облачными сервисами, входят музыкальные библиотеки (iCloud for iTunes) и файловые архивы (OneDrive в Windows и Google Drive для устройств на Android).

Некоторые современные системы полностью основаны на облачных сервисах. Примером может служить операционная система Chrome компании Google, все рабочее окружение которой полностью основано на веб-браузере. Десять лет назад такое показалось бы странным, но теперь, если вспомнить, сколько времени мы проводим в браузере... в общем, в Купертино или Редмонде никто над этим смеяться не будет.

Облачные технологии можно использовать и в сценариях командной оболочки, так что давайте попробуем. Сценарии в этой главе в основном предназначены для OS X, но предлагаемые в них идеи легко воплотить в Linux или в других BSD-системах.

№ 89. Поддержание непрерывной работы Dropbox

Dropbox — одна из множества облачных систем хранения данных, ставшая особенно популярной благодаря своей широкой доступности в iOS, Android, OS X, Windows и Linux. Важно понимать, что Dropbox — облачная система, то есть та ее часть, что действует на вашем устройстве, — это лишь небольшое приложение, которое выполняется в фоновом режиме, соединяет вашу систему с серверами Dropbox в Интернете и имеет весьма скудный пользовательский интерфейс. Если это приложение не запущено, то невозможно успешно копировать и синхронизировать файлы с вашего компьютера в Dropbox.

Чтобы проверить, присутствует ли в системе работающая программа, достаточно вызвать команду ps, как показано в листинге 13.1.

Код

Листинг 13.1. Сценарий startdropbox

#!/bin/bash

# startdropbox -- гарантирует выполнение Dropbox в OS X

app="Dropbox.app"

verbose=1

running="$(ps aux | grep -i $app | grep -v grep)"

if [ "$1" = "-s" ] ; then # -s -- немой режим.

  verbose=0

fi

if [ ! -z "$running" ] ; then

  if [ $verbose -eq 1 ] ; then

    echo "$app is running with PID $(echo $running | cut -d\ -f2)"

  fi

else

  if [ $verbose -eq 1 ] ; then

    echo "Launching $app"

  fi

  open -a $app

fi

exit 0

Как это работает

Ключевую роль в этом сценарии играют две строки со значками и . Первая вызывает команду ps и затем использует последовательность команд grep, чтобы отыскать требуемое приложение — Dropbox.app — и одновременно исключить из результатов саму команду grep. Если получится непустая строка, значит, Dropbox действует в режиме демона (демоном называется программа, которая предназначена для работы в фоновом режиме, 24 часа в сутки, 7 дней в неделю, и решает те или иные задачи, не требуя вмешательства пользователя), и на этом все.

Если программа Dropbox.app не запущена, сценарий вызывает команду open в OS X, которая сама отыщет приложение и запустит его.

Запуск сценария

Если сценарий вызывается с флагом -s, он ничего не выводит. Но по умолчанию выводится информация о состоянии программы, как показано в листинге 13.2.

Результаты

Листинг 13.2. Вызов сценария startdropbox для запуска Dropbox.app

$ startdropbox

Launching Dropbox.app

$ startdropbox

Dropbox.app is running with PID 22270

Усовершенствование сценария

В этом сценарии мало что можно усовершенствовать, но, если вы пожелаете перенести его в систему Linux, не забудьте установить официальные пакеты Dropbox с веб-сайта проекта. Запустить Dropbox (после правильной настройки) можно командой startdropbox.

№ 90. Синхронизация с Dropbox

Не составляет труда написать сценарий, синхронизирующий папку или набор файлов с облачной системой, такой как Dropbox. Система сама заботится о синхронизации содержимого локального каталога Dropbox с копией в облаке, обычно эмулируя локальный жесткий диск в системе.

Сценарий в листинге 13.3, syncdropbox, пользуется этим обстоятельством и позволяет легко и просто скопировать каталог с файлами или заданный набор файлов во вселенную Dropbox. В первом случае копируются все файлы в каталоге; во втором — файлы из заданного списка сбрасываются в папку sync в Dropbox.

Код

Листинг 13.3. Сценарий syncdropbox

#!/bin/bash

# syncdropbox -- синхронизирует заданный набор файлов или указанную

#   папку с хранилищем Dropbox. Это достигается путем копирования

#   папки в ~/Dropbox или набора файлов в папку sync в Dropbox с последующим

#   запуском Dropbox.app, если это необходимо.

name="syncdropbox"

dropbox="$HOME/Dropbox"

sourcedir=""

targetdir="sync" # Целевая папка в Dropbox для отдельных файлов.

# Проверить начальные аргументы.

if [ $# -eq 0 ] ; then

  echo "Usage: $0 [-d source-folder] {file, file, file}" >&2

  exit 1

fi

if [ "$1" = "-d" ] ; then

  sourcedir="$2"

  shift; shift

fi

# Проверка допустимости.

if [ ! -z "$sourcedir" -a $# -ne 0 ] ; then

  echo "$name: You can't specify both a directory and specific files." >&2

  exit 1

fi

if [ ! -z "$sourcedir" ] ; then

  if [ ! -d "$sourcedir" ] ; then

    echo "$name: Please specify a source directory with -d." >&2

    exit 1

  fi

fi

#######################

#### ГЛАВНЫЙ БЛОК

#######################

if [ ! -z "$sourcedir" ] ; then

  if [ -f "$dropbox/$sourcedir" -o -d "$dropbox/$sourcedir" ] ; then

    echo "$name: Specified source directory $sourcedir already exists." >&2

    exit 1

  fi

  echo "Copying contents of $sourcedir to $dropbox..."

  # -a обеспечивает рекурсивное копирование с сохранением

  #   информации о владельце и пр.

  cp -a "$sourcedir" $dropbox

else

  # Исходный каталог отсутствует, поэтому переходим к отдельным файлам.

  if [ ! -d "$dropbox/$targetdir" ] ; then

    mkdir "$dropbox/$targetdir"

    if [ $? -ne 0 ] ; then

      echo "$name: Error encountered during mkdir $dropbox/$targetdir." >&2

      exit 1

    fi

  fi

  # Все готово! Скопировать указанные файлы.

  cp -p -v "[email protected]" "$dropbox/$targetdir"

fi

# Теперь запустить приложение Dropbox, если необходимо, чтобы выполнить

#   фактическую синхронизацию.

exec startdropbox -s

Как это работает

Большая часть листинга выполняет проверку на наличие ошибок, что очень утомительно, но необходимо, чтобы гарантировать правильную работу сценария и ничего не испортить. (Никто не хочет потерять свои данные!)

Выражения проверки имеют довольно сложный вид, как, например, в строке . Данное выражение проверяет, имеется ли в папке Dropbox файл (что было бы странно) или каталог с именем в переменной $sourcedir. Дословно эта проверка читается так: «если существует-файл $dropbox/$sourcedir ИЛИ существует-каталог $dropbox/$sourcedir, тогда...».

В другой интересной строке вызывается команда cp для копирования отдельных файлов. Желающие могут почитать страницу справочного руководства для команды cp (man cp), чтобы узнать, что значат использованные здесь флаги. На всякий случай напомним, что [email protected] — это краткая форма представления всех позиционных аргументов командной строки, переданных при вызове сценария.

Запуск сценария

Подобно многим сценариям из этой книги, данный сценарий можно запустить без аргументов, чтобы получить краткую инструкцию о порядке его использования, как показано в листинге 13.4.

Листинг 13.4. Вывод сценария syncdropbox с инструкцией о порядке его использования

$ syncdropbox

Usage: syncdropbox [-d source-folder] {file, file, file}

Результаты

Далее, как показано в листинге 13.5, мы выбрали файл и сохранили его в Dropbox.

Листинг 13.5. Синхронизация выбранного файла с хранилищем Dropbox

$ syncdropbox test.html

test.html -> /Users/taylor/Dropbox/sync/test.html

$

Довольно просто и удобно, если вспомнить, что тем самым вы делаете файлы или каталог с файлами доступными на других устройствах, где настроена ваша учетная запись в Dropbox.

Усовершенствование сценария

Когда выбранный каталог уже присутствует в папке Dropbox, наверное, было бы намного полезнее сравнить содержимое локального каталога и каталога в Dropbox, чем просто выводить сообщение об ошибке и завершать работу. Кроме того, когда определяется набор файлов, было бы полезно предусмотреть возможность указывать каталог назначения в иерархии файлов в Dropbox.

ДРУГИЕ ОБЛАЧНЫЕ СЛУЖБЫ

Первые два сценария в этой главе довольно легко можно адаптировать для использования службы Microsoft OneDrive или Apple iCloud, так как они имеют ту же основную функциональность. Главное отличие заключается в соглашении об именовании и местоположении каталогов. И да, не забудьте, что OneDrive в одних контекстах имеет имя OneDrive (например, приложение, которое требуется запустить), а в других — имя SkyDrive (каталог в вашем домашнем каталоге). Однако все это легко поддается управлению.

№ 91. Создание слайд-шоу из фотопотока в облаке

Некоторые с удовольствием пользуются службой Photo Stream в iCloud, тогда как других раздражает ее стремление сохранить копии всех снимков, даже бросовых, сделанных мобильным устройством. Тем не менее возможность хранить фотографии в понравившейся облачной службе резервного копирования привлекает многих. Проблема, однако, в том, что эти файлы обычно скрыты — они глубоко зарыты в вашей файловой системе и не могут автоматически выбираться многими программами, показывающими слайд-шоу из фотографий.

Мы исправим эту ситуацию с помощью slideshow, простого сценария (представленного в листинге 13.6), который проверяет папку выгрузки фотографий, сделанных камерой, и отображает файлы, находящиеся в ней, уменьшая их до определенных размеров. Для достижения желаемого результата можно использовать утилиту display, входящую в состав ImageMagick (пакета мощных утилит, с которыми мы будем знакомиться в следующей главе). Пользователи OS X легко могут установить ImageMagick с помощью диспетчера пакетов brew:

$ brew install imagemagick --with-x11

ПРИМЕЧАНИЕ

Несколько лет назад компания Apple прекратила распространение X11, популярной графической библиотеки для Linux и BSD, со своей операционной системой. Чтобы использовать сценарий slideshow в OS X, в системе должен присутствовать пакет ImageMagick с библиотеками X11 и необходимыми для них ресурсами, для чего достаточно установить пакет XQuartz. Дополнительную информацию о пакете XQuartz и инструкции по его установке можно найти на официальном веб-сайте: https://www.xquartz.org/.

Код

Листинг 13.6. Сценарий slideshow

  #!/bin/bash

  # slideshow -- показывает слайд-шоу из фотографий, находящихся в указанном

  #   каталоге. Использует утилиту "display" из пакета ImageMagick.

  delay=2           # Задержка по умолчанию, в секундах.

  psize="1200x900>" # Предпочтительные размеры для отображения.

  if [ $# -eq 0 ] ; then

    echo "Usage: $(basename $0) watch-directory" >&2

    exit 1

  fi

  watch="$1"

  if [ ! -d "$watch" ] ; then

    echo "$(basename $0): Specified directory $watch isn't a directory." >&2

    exit 1

  fi

  cd "$watch"

  if [ $? -ne 0 ] ; then

    echo "$(basename $0): Failed trying to cd into $watch" >&2

    exit 1

  fi

  suffixes="$(file * | grep image | cut -d: -f1 | rev | cut -d. -f1 | \

    rev | sort | uniq | sed 's/^/\*./')"

  if [ -z "$suffixes" ] ; then

    echo "$(basename $0): No images to display in folder $watch" >&2

    exit 1

  fi

  /bin/echo -n "Displaying $(ls $suffixes | wc -l) images from $watch "

  set -f ; echo "with suffixes $suffixes" ; set +f

  display -loop 0 -delay $delay -resize $psize -backdrop $suffixes

  exit 0

Как это работает

Сценарий в листинге 13.6 потребовал от нас не очень много усилий, если не считать изматывающего процесса изучения всех аргументов ImageMagick, необходимых, чтобы добиться желаемого эффекта с помощью команды display. Вся глава 14 будет посвящена ImageMagick, поскольку инструменты, входящие в состав пакета, чертовски полезны. С помощью этого сценария вы можете подготовиться к тому, что вас ждет. А пока просто поверьте, что все написано правильно, в том числе и странного вида определение геометрии изображений 1200x900> , где завершающий символ > означает: «изменять размеры изображений до указанных, сохраняя пропорции оригинальной геометрии».

Иными словами, изображение с размерами 2200 × 1000 будет автоматически уменьшено до 1200 пикселей по горизонтали и, чтобы сохранить пропорции, с 1000 до 545 пикселей по вертикали. Отлично!

Сценарий также гарантирует, что команда file найдет все файлы изображений в указанном каталоге, после чего, с помощью последовательности замысловатых преобразований, имена найденных файлов будут сокращены до расширений (*.jpg, *.png и так далее).

Проблема этого кода в сценарии на языке командной оболочки в том, что каждый раз, когда сценарий ссылается на звездочку, она замещается списком всех имен файлов, соответствующих шаблонным символам, а значит, он выведет не последовательность символов *.jpg, но имена всех файлов .jpg в текущем каталоге. Именно поэтому сценарий временно запрещает автоматическую подстановку имен файлов , способность командной оболочки выполнять подстановку имен файлов вместо шаблонных символов.

Однако если автоматическую подстановку выключить для всего сценария, программа display сообщит, что не может найти файл изображения с именем *.jpg. А это плохо.

Запуск сценария

Передайте сценарию каталог с одним или несколькими файлами изображений, в идеале — фотоархив из облачной системы хранения данных, например OneDrive или Dropbox, как показано в листинге 13.7.

Результаты

Листинг 13.7. Запуск сценария slideshow для отображения изображений из облачного архива

$ slideshow ~/SkyDrive/Pictures/

Displaying 2252 images from ~/Skydrive/Pictures/ with suffixes *.gif *.jpg *.png

После запуска сценария на экране должно появиться новое окно, в котором, сменяя друг друга, будут появляться сохраненные и синхронизированные изображения. Прекрасный сценарий для совместного просмотра всех замечательных фотографий, которые вы сделали в отпуске!

Усовершенствование сценария

В этот сценарий много чего можно было бы добавить, чтобы сделать его более элегантным, например, позволить пользователям самим указывать параметры, которые в настоящее время зашиты в вызов display (такие, как размеры изображений). В частности, вы можете разрешить использовать разные устройства отображения, чтобы выводить изображение на втором экране, или менять скорость смены изображений.

№ 92. Синхронизация файлов с Google Drive

Google Drive — еще одна популярная облачная система хранения данных. В сочетании с комплектом офисных утилит Google, она служит шлюзом к целой системе редактирования и публикации, что делает ее особенно интересной в роли инструмента синхронизации. Скопируйте файл в формате Microsoft Word на свое устройство Google Drive, и вы сможете править его в любом веб-браузере, на любом компьютере. То же относится к презентациям, электронным таблицам и даже фотографиям. Чертовски удобно!

Следует, однако, отметить, что Google Drive хранит в вашей локальной системе не сами файлы документов, а только ссылки на документы в облаке. Например:

$ cat M3\ Speaker\ Proposals\ \(voting\).gsheet

{"url": "https://docs.google.com/spreadsheet/ccc?key=0Atax7Q4SMjEzdGdxYVVzdXRQ

WVpBUFh1dFpiYlpZS3c&usp=docslist_api", "resource_id": "spreadsheet:0Atax7Q4SMj

EzdGdxYVVzdXRQWVpBUFh1dFpiYlpZS3c"}

Определенно, перед нами не содержимое электронной таблицы.

Немного поиграв с командой curl, вы, возможно, сумели бы написать утилиту для анализа этой метаинформации, но давайте сосредоточимся на чем-нибудь попроще, а именно, напишем сценарий, с помощью которого вы сможете выбирать файлы и копировать их в свою учетную запись Google Drive, как показано в листинге 13.8.

Код

Листинг 13.8. Сценарий syncgdrive

  #!/bin/bash

  # syncgdrive -- позволяет указать один или несколько файлов, чтобы

  #   автоматически скопировать их в вашу папку Google Drive, которая

  #   синхронизируется с вашей учетной записью в облаке.

  gdrive="$HOME/Google Drive"

  gsync="$gdrive/gsync"

  gapp="Google Drive.app"

  if [ $# -eq 0 ] ; then

    echo "Usage: $(basename $0) [file or files to sync]" >&2

    exit 1

  fi

  # Проверить, запущен ли Google Drive? Если нет, запустить.

  if [ -z "$(ps -ef | grep "$gapp" | grep -v grep)" ] ; then

    echo "Starting up Google Drive daemon..."

    open -a "$gapp"

  fi

  # Теперь проверить наличие папки /gsync.

  if [ ! -d "$gsync" ] ; then

    mkdir "$gsync"

    if [ $? -ne 0 ] ; then

      echo "$(basename $0): Failed trying to mkdir $gsync" >&2

      exit 1

    fi

  fi

  for name    # Цикл по аргументам сценария.

  do

    echo "Copying file $name to your Google Drive"

    cp -a "$name" "$gdrive/gsync/"

  done

  exit 0

Как это работает

Подобно сценарию № 89 в начале главы, этот сценарий перед копированием файла или файлов в папку Google Drive проверяет, выполняется ли демон службы. Проверку выполняет блок, начинающийся в строке .

Для большей надежности следовало бы проверить код, возвращаемый командой open, но мы оставим это вам, уважаемый читатель, в качестве самостоятельного упражнения, хорошо?

Затем сценарий гарантирует наличие подкаталога gsync в папке Google Drive, создавая его при необходимости, и затем просто копирует туда указанные файлы, используя удобный ключ -a в команде cp, чтобы предотвратить искажение времени создания и последнего изменения.

Запуск сценария

Просто передайте сценарию один или несколько файлов, которые вам хотелось бы синхронизировать с вашей учетной записью Google Drive, и сценарий сделает все необходимое для этого.

Результаты

Это круто, правда. Укажите файл, который нужно скопировать в Google Drive, как показано в листинге 13.9.

Листинг 13.9. Запуск Google Drive и синхронизация файлов с помощью сценария syncgdrive

$ syncgdrive sample.crontab

Starting up Google Drive daemon...

Copying file sample.crontab to your Google Drive

$ syncgdrive ~/Documents/what-to-expect-op-ed.doc

Copying file /Users/taylor/Documents/what-to-expect-op-ed.doc to your Google

Drive

Обратите внимание, что в первом случае был произведен также запуск демона Google Drive. После нескольких секунд ожидания, необходимых на копирование файлов в облачную систему хранения, они появились в веб-интерфейсе Google Drive, как показано на рис. 13.1.

13-01.tif

Рис. 13.1. Шаблон файла crontab и офисный документ, синхронизированные с Google Drive, автоматически появились в веб-интерфейсе

Усовершенствование сценария

В описании сценария допущена небольшая некорректность: когда вы указываете файл для синхронизации, сценарий не предохраняет его от рассинхронизации в будущем; он просто копирует файл один раз и все. По-настоящему интересным усовершенствованием стало бы создание более мощной версии этого сценария, которой можно было бы передать файлы для копирования, и которая регулярно проверяла бы их и копировала обновленные версии в каталог gsync.

№ 93. Компьютер сказал...

В состав OS X входит сложная система синтеза речи, которая может голосом сказать, что происходит в вашей системе. Обычно она находится в разделе Accessibility (Универсальный доступ), и вы наверняка оцените способность компьютера вслух сообщать об ошибках или читать файлы.

Как оказывается, весь функционал этой системы и пакет разнообразных голосов доступны также из командной строки, через встроенную утилиту say. Ее можно проверить следующей командой:

$ say "You never knew I could talk to you, did you?"

Мы знали, что вам это понравится!

С этой программой можно сделать много чего, но для начала напишем сценарий-обертку, который поможет выявить установленные голоса и послушать, как они звучат. Сценарий в листинге 13.10 не заменяет команду say; он лишь упрощает работу с ней (обычное дело для подобных сценариев в этой книге).

Код

Листинг 13.10. Сценарий sayit

#!/bin/bash

# sayit -- использует команду "say" для всего, что будет указано (только для OS X).

dosay="$(which say) --quality=127"

format="$(which fmt) -w 70"

voice="" # По умолчанию системный голос.

rate=""  # По умолчанию стандартная скорость произношения.

demovoices()

{

  # Предлагает прослушать произношение каждым доступным голосом.

  voicelist=$( say -v \? | grep "en_" | cut -c1-12 \

    | sed 's/ /_/;s/ //g;s/_$//')

  if [ "$1" = "list" ] ; then

    echo "Available voices: $(echo $voicelist | sed 's/ /, /g;s/_/ /g') \

      | $format"

    echo "HANDY TIP: use \"$(basename $0) demo\" to hear all the voices"

    exit 0

  fi

  for name in $voicelist ; do

    myname=$(echo $name | sed 's/_/ /')

    echo "Voice: $myname"

    $dosay -v "$myname" "Hello! I'm $myname. This is what I sound like."

  done

  exit 0

}

usage()

{

  echo "Usage: sayit [-v voice] [-r rate] [-f file] phrase"

  echo " or: sayit demo"

  exit 0

}

while getopts "df:r:v:" opt; do

  case $opt in

    d ) demovoices list   ;;

    f ) input="$OPTARG"   ;;

    r ) rate="-r $OPTARG" ;;

    v ) voice="$OPTARG"   ;;

  esac

done

shift $(($OPTIND - 1))

if [ $# -eq 0 -a -z "$input" ] ; then

  $dosay "Hey! You haven't given me any parameters to work with."

  echo "Error: no parameters specified. Specify a file or phrase."

  exit 0

fi

if [ "$1" = "demo" ] ; then

  demovoices

fi

if [ ! -z "$input" ] ; then

  $dosay $rate -v "$voice" -f $input

else

  $dosay $rate -v "$voice" "$*"

fi

exit 0

Как это работает

В действительности в системе установлено больше голосов, чем указано в сводке (просто здесь перечислены голоса, оптимизированные для английского языка). Чтобы получить полный список, выполните оригинальную команду say с парамет­рами -v \?. Ниже приводится сокращенная версия полного списка голосов:

$ say -v \?

Agnes      en_US  # Разве не прекрасно иметь компьютер, который говорит с вами?

Albert     en_US  # В моем горле живет лягушка. Да, самая настоящая лягушка!

Alex       en_US  # Многие узнают меня по голосу.

Alice      it_IT  # Привет, меня зовут Алиса, я говорю по-итальянски.

--опущено--

Zarvox     en_US  # Это похоже на мирную планету.

Zuzana     cs_CZ  # Добрый день, меня зовут Сюзанна. Я говорю по-чешски.

$

Наши любимые дикторы — Пайп Орган (Pipe Organ, «Мы должны радоваться этому болезненному голосу») и Зарвокс (Zarvox, «Это похоже на мирную планету»).

Очевидно, что на выбор дается очень много голосов. Плюс, у некоторых из них очень неправильное английское произношение. Одно из решений этой проблемы — фильтровать дикторов по "en_" (или другому языку по вашему выбору), чтобы получить только голоса с нужным произношением. Для выбора американского английского языка можно использовать фильтр "en_US", но другие английские голоса тоже стоит послушать. Полный список голосов извлекается в строке .

Мы добавили в конец блока сложную череду подстановок с помощью sed, потому что этот список построен не совсем правильно: он включает имена, состоящие из одного (Fiona) и из двух слов (Bad News), а также дополнительные пробелы для выравнивания вывода по колонкам. Чтобы решить эту проблему, первый пробел в каждой строке заменяется символом подчеркивания, а все остальные пробелы удаляются. Если имя голоса состоит из одного слова, оно будет выглядеть так: "Ralph_", и заключительная подстановка sed удалит любые завершающие подчеркивания. В конце процесса остаются имена из двух слов с подчеркиванием, поэтому их нужно исправить перед выводом на экран. Однако код имеет интересный побочный эффект, в результате которого цикл while проще написать, использовав в качестве разделителя пробел.

Другой интересный блок , где каждый голос представляет себя,выполняется, когда данный сценарий вызывается как sayit demo.

Все это очень просто, нужно лишь разобраться, как работает сама команда say.

Запуск сценария

Так как этот сценарий воспроизводит речь, мы немногое можем показать в книге, а поскольку мы пока не выпустили аудиверсию «Сценариев командной оболочки» (вы сумеете представить себе все то, чего нельзя показать на картинке?), вам придется поэкспериментировать самостоятельно. Однако сценарий может перечислить и воспроизвести все установленные голоса, как показано в листинге 13.11.

Результаты

Листинг 13.11. Запуск сценария sayit для вывода списка поддерживаемых голосов и их озвучивания

$ sayit -d

Available voices: Agnes, Albert, Alex, Bad News, Bahh, Bells, Boing,

Bruce, Bubbles, Cellos, Daniel, Deranged, Fred, Good News, Hysterical,

Junior, Karen, Kathy, Moira, Pipe Organ, Princess, Ralph, Samantha,

Tessa, Trinoids, Veena, Vicki, Victoria, Whisper, Zarvox

HANDY TIP: use "sayit.sh demo" to hear all the different voices

$ sayit "Yo, yo, dog! Whassup?"

$ sayit -v "Pipe Organ" -r 60 "Yo, yo, dog! Whassup?"

$ sayit -v "Ralph" -r 80 -f alice.txt

Усовершенствование сценария

Детальное исследование вывода команды say -v \? показало, что существует по меньшей мере один голос, для которого неправильно указан код языка. Для имени Fiona указан код en-scotland, а не en_scotland, что нарушает единообразие (учитывая, что для имени Moira указан код языка en_IE, а не en-irish или en-ireland). Вы легко могли бы усовершенствовать сценарий, чтобы он обрабатывал коды обоих видов: en_ и en-. В остальном поэкспериментируйте сами и подумайте, когда было бы полезно иметь сценарий или демона, общающегося с вами.

Назад: Глава 12. Сценарии для игр и развлечений
Дальше: Глава 14. ImageMagick и обработка графических файлов