Команда cat
выдает символы мгновенно. Символ
$ cat -u
123ctl-d123ctl-d$
Интерпретатор отвечает на это выводом приглашения, поскольку команда cat
, не получив символов, считает, что файл кончился, и прекращает работу. Символ
Что произойдет, если ввести ed
? Сравните этот случай с вводом команды
$ ed файл
2.2 Что хранится в файле?
Формат файла зависит от программ, которые используют его. Типы файла весьма разнообразны, возможно, потому, что существует большое разнообразие программ. Но, поскольку типы файла не определяются файловой системой, ядро не может указать вам тип файла оно не знает его. Команда file
делает обоснованную "догадку" (мы вскоре объясним, как это происходит):
$ file /bin /bin/ed /usr/src/cmd/ed.c /usr/man/man1/ed.1
/bin: directory
/bin/ed: pure executable
/usr/src/cmd/ed.с: c program text
/usr/man/man1/ed.1: roff, nroff, or eqn input text
Здесь показаны четыре типичных файла. Все они связаны с редактором: каталог (/bin
), в котором находится редактор, двоичный файл или сама программа, готовая к выполнению (/bin/ed
), входной текст, т.е. операторы языка Си, составляющие программу (/usr/src/cmd/ed.с
), и страница справочного руководства (/usr/man/man1/ed.1
).
При определении типа файла команда file
не обращает внимания на имена (хотя могла бы), поскольку соглашения об именах — это всего лишь соглашения и поэтому на них нельзя полагаться полностью. Например, файлы, оканчивающиеся на .с
, почти всегда содержат текст программы на языке Си, но ничто не мешает вам создать файл, оканчивающийся на .с
, с произвольным содержанием. Команда file
читает первые несколько сотен байтов файла и пытается по ним определить тип последнего. (Как мы покажем позднее, файлы специального системного назначения, такие, как каталоги, могут быть идентифицированы путем запроса системы, но эта команда может определить каталог, читая его.)
Иногда установить тип файла нетрудно. Выполняемая программа помечается вначале двоичным "магическим" числом. Команда od
, запущенная без всяких флагов, выдает содержимое файла по словам в 16-разрядном или двухбайтовом представлении, и магическое число становится видимым:
$ od /bin/ed
0000000 000410 025000 000462 011444 0000000 000000 000000 000001
0000020 170011 016600 000002 005060 1777776 010600 162706 000004
0000040 016616 000004 005720 010066 0000002 005720 001376 020076
...
$
Восьмеричное число 410 отмечает готовую к выполнению программу, которую могут разделять несколько процессов. (Конкретные магические числа зависят от системы.) Набор разрядов, представляющий 410, не является символом из множества ASCII, поэтому он не может быть создан непреднамеренно такими программами, как редактор. Но, конечно, вы можете создать подобный файл, запустив свою собственную программу, а система в соответствии с соглашением сочтет его выполняемой программой.
В случае текстовых файлов указание может быть скрыто более глубоко в файле, поэтому команда file
отыскивает строки, подобные #include
, чтобы распознать текст программы на Си, или строки, начинающиеся с точки, чтобы распознать входные данные для программ nroff
или troff
.
У вас может возникнуть вопрос: почему система не следит за типами файлов более внимательно, ведь тогда, например, программе sort
в качестве входного потока никогда не попадал бы файл /bin/ed
. Одна из причин состоит в том, чтобы не потерять какие- нибудь полезные для программиста свойства. Хотя команда
$ sort /bin/ed