Файл представляет собой последовательность байтов. (Байт — небольшая порция информации, обычно размером в восемь бит. Для наших целей можно считать байт синонимом слова "символ".) Никаких ограничений по структуре системой на файл не накладывается, и никакого смысла не приписывается его содержимому: смысл байтов зависит исключительно от программ, обрабатывающих файл. Более того, как мы увидим позднее, это верно не только для файлов, хранящихся на дисках, но и для файлов, представляющих периферийные устройства. Записи на магнитных лентах, почта, символы, вводимые с клавиатуры, вывод на печатающее устройство, данные, передаваемые по конвейеру — каждый из этих файлов система и входящие в нее программы воспринимают просто как последовательность байтов.
Лучше всего познакомиться с файлами экспериментальным путем, так что начнем с создания небольшого файла:
$ ed а
now is the time,
for all good people
.
w junk
36
q
$ls -l
-rw-r--r-- 1 you 26 Sep 27 06:11 junk
$
Здесь junk
— это файл из 36 байт, т.е. 36 символов, которые вы ввели (не считая, конечно, символов, введенных при коррекции ошибок). Команда cat
показывает содержимое файла в следующем виде:
$ 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; система помещает его во входной поток, когда вы нажимаете клавишу \n
, что лишь облегчает чтение. Такого соглашения придерживаются только программы типа od
; в файле же хранится единственный байт 012.
Перевод строки — наиболее типичный пример специального символа. Другими специальными символами, связанными с некоторыми операциями управления терминалом, являются символы: шаг назад (восьмеричное значение 010 изображается как \b
), табуляция (011, \t
), возврат каретки (015, \r
).
Важно в каждом случае различать, в каком виде символ хранится в файле и как он интерпретируется в той или иной ситуации. Например, когда вы вводите с клавиатуры символ "шаг назад" (предполагая, что это ваш символ стирания), система воспринимает его как требование уничтожить символ, введенный перед ним. Оба символа — и стираемый, и "шаг назад" — на терминале исчезают, а курсор возвращается на одну позицию назад.
Если ввести последовательность
\-
(т.е. символ \
и вслед за ним "шаг назад"), то ядро в этом случае "считает", что вы действительно хотите ввести символ -
, поэтому \
исчезает, а в вашем файле появляется байт 010. Когда "шаг назад" отражается на терминале, происходит возврат курсора, так что он указывает на символ \
.
При выводе файла, содержащего символ -
, он передается на терминал без обработки, что опять приводит к передвижке курсора на одну позицию назад. Если воспользоваться командой od
, чтобы вывести файл, содержащий символ -
, он появится как байт со значением 010 или, если указан флаг -с
, как \b
.