UNIX — универсальная среда программирования | страница 39



>$ cat junk

>now is the time

>for all good people

>$

Команда >od ("octal dump" — восьмеричный дамп) выдает "изображение" всех байтов файла:

>$ od -с junk

>0000000 n o w   i s   t h e   t i m e \n

>0000020 f o r   a l l   g o o d   p e o

>0000040 p l e \n

>0000044

>$

Флаг >-с означает, что следует интерпретировать байты как символы. Если добавить флаг >-b, то можно, кроме того, показать байты как восьмеричные числа.[5]

>$ od -cb junk

>0000000  n   o   w       i   s       t   h   e       t   i   m   e  \n

>        156 157 167 040 151 163 040 164 150 145 040 164 151 155 145 012

>0000020  f   o   r       a   l   l       g   o   o   d       p   e   o

>        146 157 162 040 141 154 154 040 147 157 157 144 040 160 145 157

>0000040  d   l   e  \n

>        160 154 145 012

>0000044 $

Семизначные числа в колонке слева показывают место в файле, т.е. порядковый номер следующего изображаемого символа в восьмеричной форме. Между прочим, приоритет восьмеричных чисел — это пережиток времен PDP-11, когда восьмеричной нотации отдавалось предпочтение. Для других машин больше подходит шестнадцатеричная нотация; флаг >-х предписывает команде >od печатать информацию в шестнадцатеричной форме.

Обратите внимание на то, что после каждой строки идет символ с восьмеричным значением 012. Это символ перевода строки для ASCII; система помещает его во входной поток, когда вы нажимаете клавишу RETURN. По соглашению, заимствованному из языка Си, символ перевода строки изображается как >\n, что лишь облегчает чтение. Такого соглашения придерживаются только программы типа >od; в файле же хранится единственный байт 012.

Перевод строки — наиболее типичный пример специального символа. Другими специальными символами, связанными с некоторыми операциями управления терминалом, являются символы: шаг назад (восьмеричное значение 010 изображается как >\b), табуляция (011, >\t), возврат каретки (015, >\r).

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

Если ввести последовательность

>\←

(т.е. символ >\ и вслед за ним "шаг назад"), то ядро в этом случае "считает", что вы действительно хотите ввести символ