Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

Очень часто используются в комбинации с командой форматированного вывода pr.

bash$ pr -options file1.txt | lp

Программы подготовки текста к печати, такие как groff и Ghostscript, так же могут напрямую взаимодействовать с lp.

bash$ groff -Tascii file.tr | lp

bash$ gs -options | lp file.ps

Команда lpq предназначена для просмотра очереди заданий печати, а lprm– - для удаления заданий из очереди.

tee

[UNIX заимствовал

эту идею из водопроводного дела.]

Это опрератор перенаправления, но с некоторыми особенностями. Подобно водопроводным трубам, "tee" позволяет "направить поток" данных в несколько файлов и на stdout одновременно, никак не влияя на сами данные. Эта команда может оказаться очень полезной при отладке.

tee

|------> в файл

|

===============|===============

command--->----|-operator-->---> результат работы команд(ы)

===============================

cat listfile* | sort | tee check.file | uniq > result.file

(Здесь, в файл check.file будут записаны данные из всех "listfile*", в отсортированном виде до того, как повторяющиеся строки будут удалены командой uniq.)

mkfifo

Эта, редко встречающаяся, команда создает именованный канал– очередь, через который производится обмен данными между процессами [ 35 ] . Как правило, один процесс записывает данные в очередь (FIFO), а другой читает данные из очереди. См. Пример A-17.

pathchk

Производит проверку полного имени файла -- проверяет, доступны ли на чтение, каталоги в пути к файлу, и не превышает ли длина полного имени файла 255 символов. При несоблюдении одного из условий -- возвращает сообщение об ошибке.

35

Эта тема прекрасно освещена в статье, которую написал Andy Vaught, Introduction to Named Pipes, в сентябре 1997 для Linux Journal.

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

dd

Эта немного непонятная и "страшная" команда ("data duplicator") изначально использовалась для переноса данных на магнитной ленте между микрокомпьютерами с ОС UNIX и майнфреймами IBM. Команда dd просто создает копию файла (или stdin/stdout), выполняя по пути некоторые преобразования. Один из вариантов: преобразование из ASCII в EBCDIC [ 36 ] , dd --help выведет список возможных вариантов преобразований и опций этой мощной утилиты.

36

EBCDIC (произносится как "ebb-sid-ic") -- это аббревиатура от Extended Binary Coded Decimal Interchange Code (Расширенный Двоично-Десятичный Код Обмена Информацией). Это формат представления данных от IBM, не нашедший широкого применения. Не совсем обычное применение опции conv=ebcdic -- это использовать dd для быстрого и легкого, но слабого, шифрования текстовых файлов.

cat $file | dd conv=swab,ebcdic > $file_encrypted

# Зашифрованный файл будет выглядеть как "абракадабра".

# опция swab добавлена для внесения большей неразберихи.

cat $file_encrypted | dd conv=swab,ascii > $file_plaintext

#

Декодирование.

# Изучаем 'dd'.

n=3

p=5

input_file=project.txt

output_file=log.txt

dd if=$input_file of=$output_file bs=1 skip=$((n-1)) count=$((p-n+1)) 2> /dev/null

# Извлечет из $input_file символы с n-го по p-й.

echo -n "hello world" | dd cbs=1 conv=unblock 2> /dev/null

# Выведет "hello world" вертикально.

# Спасибо, S.C.

Для демонстрации возможностей dd, попробуем перехватить нажатия на клавиши.

Пример 12-41. Захват нажатых клавиш

#!/bin/bash

# Захват нажатых клавиш.

keypresses=4 # Количество фиксируемых нажатий.

old_tty_setting=$(stty -g) # Сохранить настройки терминала.

echo "Нажмите $keypresses клавиши."

stty -icanon -echo # Запретить канонический режим.

# Запретить эхо-вывод.

keys=$(dd bs=1 count=$keypresses 2> /dev/null)

# 'dd' использует stdin, если "if" не задан.

stty "$old_tty_setting" # Восстановить настройки терминала.

echo "Вы нажали клавиши \"$keys\"."

# Спасибо S.C.

exit 0

Команда dd имеет возможность произвольного доступа к данным в потоке.

echo -n . | dd bs=1 seek=4 of=file conv=notrunc

# Здесь, опция "conv=notrunc" означает, что выходной файлне будет усечен.

# Спасибо, S.C.

Команда dd может использоваться для создания образов дисков, считывая данные прямо с устройств, таких как дискеты, компакт диски, магнитные ленты (Пример A-6). Обычно она используется для создания загрузочных дискет.

dd if=kernel-image of=/dev/fd0H1440

Точно так же, dd может скопировать все содержимое дискеты, даже с неизвестной файловой системой, на жесткий диск в виде файла-образа.

dd if=/dev/fd0 of=/home/bozo/projects/floppy.img

Еще одно применение dd– - создание временного swap-файла (Пример 28-2) и ram-дисков (Пример 28-3). Она может создавать даже образы целых разделов жесткого диска, хотя и не рекомендуется делать это без особой на то необходимости.

Многие (которые, вероятно, не знают чем себя занять) постоянно придумывают все новые и новые области применения команды dd.

Пример 12-42. Надежное удаление файла

#!/bin/bash

# blotout.sh: Надежно удаляет файл.

# Этот суенарий записывает случайные данные в заданный файл,

#+ затем записывает туда нули и наконец удаляет файл.

# После такого удаления даже анализ дисковых секторов

#+ не даст ровным счетом ничего.

PASSES=7 # Количество проходов по файлу.

BLOCKSIZE=1 # операции ввода/вывода в/из /dev/urandom требуют указания размера блока,

#+ иначе вы не получите желаемого результата.

E_BADARGS=70

E_NOT_FOUND=71

E_CHANGED_MIND=72

if [ -z "$1" ] # Имя файла не указано.

then

echo "Порядок использования: `basename $0` filename"

exit $E_BADARGS

fi

file=$1

Поделиться с друзьями: