===============|===============
command--->----|-operator-->---> результат работы команд(ы)
===============================
cat listfile* | sort | tee check.file | uniq > result.file
(Здесь, в файл check.file будут записаны данные из всех "listfile*", в отсортированном виде до того, как повторяющиеся строки будут удалены командой uniq.)
mkfifo
Эта, редко встречающаяся, команда создает именованный канал - очередь, через который производится обмен данными между процессами [ 35 ] Эта тема прекрасно освещена в статье, которую написал Andy Vaught, Introduction to Named Pipes, в сентябре 1997 для Linux Journal.
. Как правило, один процесс записывает данные в очередь (FIFO), а другой читает данные из очереди. См. Пример A-17.
pathchk
Производит проверку полного имени файла -- проверяет, доступны ли на чтение, каталоги в пути к файлу, и не превышает ли длина полного имени файла 255 символов. При несоблюдении одного из условий -- возвращает сообщение об ошибке.
К сожалению, pathchkне возвращает соответствующего кода ошибки, и потому, в общем-то, бесполезна в сценариях. Вместо нее лучше использовать операторы проверки файлов.
dd
Эта немного непонятная и "страшная" команда ("data duplicator") изначально использовалась для переноса данных на магнитной ленте между микрокомпьютерами с ОС UNIX и майнфреймами IBM. Команда ddпросто создает копию файла (или stdin/stdout), выполняя по пути некоторые преобразования. Один из вариантов: преобразование из ASCII в EBCDIC [ 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 --helpвыведет список возможных вариантов преобразований и опций этой мощной утилиты.
# Изучаем '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
Читать дальше