Знакомство с Linux
3.1 Введение
3.2 Базовые концепции UNIX
3.2.1 Регистрация в системе (открытие счета)
3.2.2 Вход в систему
3.2.3 Виртуальные консоли
3.2.4 Shells и команды
3.2.5 Выход из системы
3.2.6 Смена пароля
3.2.7 Файлы и каталоги
3.2.8 Дерево каталогов
3.2.9 Текущий рабочий каталог
3.2.10 Обращение к домашнему каталогу
3.3 Первые шаги в UNIX
3.3.1 Первая прогулка
3.3.2 Разглядывание содержимого каталогов
3.3.3 Создание новых каталогов
3.3.4 Копирование файлов
3.3.5 Перемещение файлов
3.3.6 Удаление файлов и каталогов
3.3.7 Рассматривание файлов
3.3.8 Получение оперативной помощи
3.4 Краткая информация о базовых командах
3.5 Исследование файловой системы
3.6 Типы оболочек
3.7 "Уайлдкард" - "дикая карта"
3.8 Трубопроводы UNIX
3.8.1 Стандартный вход и стандартный выход
3.8.2 Перенаправление входа и выхода
3.8.3 Использование конвейера
3.8.4 Перенаправление с добавлением
3.9 Права доступа к файлам
3.9.1 Концепция прав доступа
3.9.2 Интерпретация прав доступа
3.9.3 Зависимости
3.9.4 Изменение прав доступа
3.10 Управление связями файлов
3.10.1 Жесткие связи
3.10.2 Символические связи
3.11 Управление работами
3.11.1 Работы и процессы
3.11.2 Выполнение работ на переднем плане и в фоне
3.11.3 Работа в фоне и ликвидация работ
3.11.4 Остановка и возобновление работы
3.12 Использование редактора vi
3.12.1 Концепции
3.12.2 Начала vi
3.12.3 Вставка текста
3.12.4 Удаление текста
3.12.5 Изменение текста
3.12.6 Команды перемещения
3.12.7 Сохранение файлов и выход из vi
3.12.8 Редактирование еще одного файла
3.12.9 Включение других файлов
3.12.10 Выполнение команд Shell
3.12.11 Получение помощи
3.13 Установка среды
3.13.1 Сценарии shell
3.13.2 Перемещение shell и среда
3.13.2.1 Переменная среды PATH
3.13.3 Shell-Сценарии инициализации
3.14 Не хотите ли отправиться в самостоятельное плавание
3 Знакомство с Linux
3.1 Введение
Новые пользователи UNIX и Linux могут быть ошеломлены размерами и очевидной сложностью системы, которая предстала перед ними. Существует много хороших книг по использованию UNIX для всех уровней подготовки: от новичка до эксперта. Но ни одна из этих книг не обсуждает особенности Linux. Хотя 95% всего связанного с использованием Linux абсолютно аналогично другим UNIX-системам, наиболее прямой путь освоения этой системы - это по учебнику, написанному применительно к Linux. Вот эта книга и есть такой учебник.
Эта глава не заводит в дебри деталей и не обсуждает наиболее сложные прим. переводчика: они (и уже у нас тоже) говорят - продвинутые аспекты Linux. Вместо этого делается попытка поставить новичка крепко на ноги, чтобы он мог в дальнейшем читать и более общие книги по UNIX, понимая базовые различия других UNIX-систем и Linux.
Здесь не предполагается каких-то предварительных знаний, за исключением первоначального знакомства с персональным компьютером и MS-DOS. Но даже если вы не успели побывать пользователем MS-DOS, вы все равно все здесь поймете. На первый взгляд UNIX очень похож на MS-DOS (в конце концов фрагменты MS-DOS были спроектированы с оглядкой на операционную систему CP/M, которая, в свою очередь, проектировалась с оглядкой на UNIX). Но только при очень уж поверхностном взгляде можно говорить о похожести UNIX и MS-DOS. Если вы абсолютный новичок в мире персональных компьютеров, этот учебник вам поможет.
И прежде, чем начать, призываем: не бойтесь экспериментировать. Система вас не укусит. Работая на ней вы ничего не сможете сломать. UNIX имеет встроенные средства защиты, чтобы не дать "нормальным" пользователям (это теперь и вы) возможность испортить важные для системы файлы. Самое плохое, что вы можете натворить - это уничтожить все свои файлы, а тогда, может быть придется и переинсталлировать заново систему прим. переводчика: как правило, чтобы довести систему до переинсталляции, надо иметь прав больше, чем у "нормального" пользователя.
3.2 Базовые концепции UNIX
UNIX это многозадачная, многопользовательская операционная система. Это означает, что много людей может одновременно использовать один компьютер, выполняя много различных задач. (Это существенное отличие от MS-DOS, где только один человек может использовать в данный момент операционную систему). В UNIX пользователи должны себя идентифицировать при входе, что состоит из двух шагов: ввода имени (имя, по которому вас идентифицирует система) и входной пароль, который является вашим секретным словом для открытия вашего счета (регистрации в системе). Поскольку только вы знаете пароль, никто не может войти в систему под вашим именем.
В традиционных UNIX-системах системный администратор присвоит вам имя и начальный пароль при вашей регистрации в системе (при заведении в системе нового пользователя). Но поскольку на своем персональном компьютере вы и системный администратор, вы должны себя (как пользователя) зарегистрировать в системе, прежде чем в нее войдете (смотрите Раздел 3.2.1 ниже). Для дальнейших разговоров возьмем условное имя ``larry''.
Кроме прочего, каждая система UNIX имеет приписанное ей hostname (хозяйское имя). Это хозяйское имя добавляет машине характера и очарования. Hostname используется для идентификации отдельных машин в сети, но даже если ваша машина не в сети, она все равно должна иметь hostname. В Разделе 4.10.2 мы подробно расскажем об установке hostname на вашей машине. Например, имя машины, обсуждаемой ниже - ``mousehouse'' (мышиная норка).
3.2.1 Регистрация в системе (открытие счета)
Прежде, чем вы сможете использовать систему, вы должны зарегистрировать себя в системе. Это необходимо потому, что неразумно использовать имя суперпользователя (root) для обычных нужд. Пользователь root нужен для выполнения привилегированных команд и сопровождения системы, как это описывается в Разделе 4.1.
Для того, чтобы зарегистрировать себя, вам необходимо зайти в систему под именем root и использовать команду useradd или adduser. Об этой процедуре смотрите подробней в Разделе 4.4.
3.2.2 Вход в систему
При входе вы увидите на экране подсказку, например, такого вида:
mousehouse login:
Введите свое имя и нажмите клавишу Return. Наш герой larry напечатает следующее:
mousehouse login: larry
Password:
Теперь введите ваш пароль (password). При вводе пароль не будет отображаться на экране, так что набирайте внимательнее. Если вы неправильно набрали пароль, то увидите на экране сообщение
Login incorrect
и вам следует попытаться еще раз.
Когда вы наконец правильно введете имя пользователя и пароль, вы официально будете допущены в систему и можете в ней свободно путешествовать.
3.2.3 Виртуальные консоли
Системная консоль - это монитор и клавиатура, связанные непосредственно с системой. (Поскольку UNIX многопользовательская система, вы можете иметь дополнительные терминалы, связанные через последовательные порты с вашей системой, но они не будут консолями). Linux, как и некоторые другие версии UNIX, обеспечивает доступ к виртуальным консолям (или VC), которые позволяют войти в систему под несколькими именами в одно время.
Для демонстрации этого войдите в систему (как было показано ранее). Теперь нажмите alt-F2. Вы должны снова увидеть подсказку login: , то есть перед вами вторая виртуальная консоль, а вы вошли через первую. Чтобы переключиться обратно на первую VC, нажмите alt-F1. Оп-ля! Вы снова на первой консоли.
Свежеинсталлированный Linux возможно позволит вам работать с четырьмя первыми VC, используя от alt-F1 до alt-F4. Но возможно обеспечить работу с 12-ю VC - по одной на каждую функциональную клавишу. Как видите, использование VC может быть очень эффективным - вы можете работать на нескольких VC одновременно.
В то время, как использование виртуальных консолей ограничено (кроме прочего, в каждый момент времени вы можете видеть только одну виртуальную консоль) оно дает вам представление о многопользовательских возможностях UNIX. Пока вы работаете на VC #1, вы можете переключиться на VC #2 и начать работу над чем-то другим.
3.2.4 Shells и команды
В большинстве ваших исследований мира UNIX вы будете общаться с ним через оболочку shell. Shell - это просто программа, которая воспринимает введенное пользователем, (т.е. команды, которые вы напечатаете) и транслирует это в команды системе. Это можно сравнить с программой COMMAND.COM под MS-DOS, которая делает нечто похожее. Shell - это лишь один из интерфейсов UNIX. Существует много различных интерфейсов, таких как X Window System, которая позволяет выполнять команды используя мышь и клавиатуру в сочетании.
Как только вы вошли, система запускает shell и вы можете вводить для него команды. Вот короткий пример. Как раз Larry вошел в систему и система вновь выдала подсказку:
mousehouse login: larry
Password: larry's password
Welcome to Mousehouse!
/home/larry#
``/home/larry#'' это подсказка shell, показывающая, что он готов принимать команды. (Подробнее про подсказкy позже). Давайте попросим систему сделать что-нибудь интересьненькое:
/home/larry# make love
make: *** No way to make target `love'. Stop.
/home/larry#
Хм, как оказалось, "make" - это имя существующей в системе программы и shell пытался выполнить эту команду. (Жаль, но система отнеслась к просьбе недружественно).
Это подводит нас к жгучему вопросу: Что такое команды? Что происходит, когда вы вводите ``make love''? Первое слово командной строки ``make'' это имя команды, которую предполагается выполнить. Все остальное в командной строке воспринимается как аргументы команды.
Примеры:
/home/larry# cp foo bar
Здесь имя команды ``cp'', а аргументы ``foo'' и ``bar''.
Когда вы вводите команду, shell делает несколько вещей. Во-первых, смотрит на то, что может (должно) быть именем команды и является ли это внутренней для shell командой. (Внутренняя, это команда, которую shell знает как выполнять. Существует ряд таких команд, мы о них поговорим позже). Shell также проверяет, не является ли команда синонимом другой или требуется подстановка имени. Если этого не надо делать, shell ищет соответствующую этому имени программу на диске. Если shell находит такую программу, он ее выполняет, передавая ей аргументы из командной строки.
В нашем примере shell ищет программу по имени make и пытается выполнить ее с аргументом love. make - это программа, которая часто используется при компиляции больших программ, она берет в качестве аргумента имя "целевого" файла компиляции. В случае ``make love'' мы приказали команде make откомпилировать love. Поскольку make не смог найти файла с таким именем, он сообщил (несколько забавным образом) о невозможности выполнить команду и вернулся в подсказку.
Что случится, если мы введем команду, а shell не сможет найти программу с этой командой? Давайте попробуем:
/home/larry# eat dirt
eat: command not found
/home/larry#
Все очень просто, если shell не может найти программу с именем данным в командной строке (здесь ``eat''), он выдает сообщение об ошибке, которое объясняет причину невыполнения команды. Вы часто будете видеть это сообщение, если будете вводить имена команд с ошибками. (например, напечатаете ``make love'' вместо ``make love'').
3.2.5 Выход из системы
Прежде, чем идти дальше, мы расскажем, как выйти из системы. При наличии подсказки shell используйте команду
/home/larry# exit
для выхода. Есть другие способы выхода, но этот самый безопасный.
3.2.6 Смена пароля
Вы также должны представлять, как можно менять пароль. Команда "passwd" прим. переводчика: именно с пропущенными буквами она и пишется спросит вас про старый пароль и про новый. Она попросит дважды ввести новый пароль для надежности. Внимание! Не забывайте свой пароль, иначе вам придется просить системного администратора уничтожить его и установить новый (Если вы и есть системный администратор, смотрите Раздел 4.4).
3.2.7 Файлы и каталоги
Во многих операционных системах (включая UNIX) существует концепция файла, по которой его можно рассматривать просто, как набор информации, которому дано имя. Примерами файлов будут: программа, которая может выполняться, письмо, полученное по электронной почте, написанная вами статья. Существенно то, что все, что хранится на диске, хранится в отдельных файлах.
Файлы идентифицируются по именам. Например, файл, содержащий вашу статью может быть сохранен под именем my-paper. Эти имена обычно каким-то образом отражают содержание. Не существует стандартного формата имен файлов, как в MS-DOS и других операционных системах; в общем случае имена файлов могут содержать любые символы (кроме / - смотрите ниже обсуждение формирования "путей") и ограничены 256 символами по длине.
Одновременно с концепцией файла рассмотрим и концепцию каталога. Каталог - это совокупность файлов. Его можно рассматривать как "папку", содержащую множество различных файлов. Каталоги сами по себе также получают имена, по которым вы их различаете. Каталоги организованы в древовидную структуру, т.е. каталоги могут содержать другие каталоги.
К файлу можно обращаться по пути (pathname), формируемой из имени файла, которому предшествует имя каталога, содержащего файл Например, скажем, Larry имеет каталог, названный papers, который содержит три файла: history-final, english-lit, и masters-thesis. (Каждый из этих трех файлов содержит информацию о проводимых Larry работах). Для того, чтобы обратиться к файлу english-lit, Larry может указать маршрут:
papers/english-lit
Как вы видите, имена каталогов и файлов разделяются единичным слэшем (/). Поэтому имена файлов сами по себе не могут содержать этот символ. Пользователи MS-DOS увидят в этом что-то знакомое, поскольку в MS-DOS для этого используется бэкслэш (\).
Как уже говорилось, каталоги могут быть вставлены друг в друга. Например, пусть Larry в каталоге papers имеет другой каталог с названием notes. Этот каталог содержит файлы с именами math-notes и cheat-sheet. Путь файла cheat-sheet будет
papers/notes/cheat-sheet
Поэтому путь - это маршрут, который надо проделать, чтобы добраться до конкретного файла. Каталог выше данного (под)каталога называется родительским каталогом. Здесь каталог papers является родительским для каталога notes.
3.2.8 Дерево каталогов
Большинство систем UNIX имеет стандартную структуру каталогов, что облегчает конкретную установку системы. Структура представляет из себя дерево каталогов, начинающееся с каталога ``/'', известного под названием "корневой каталог". Каталоги ниже / относятся к числу важнейших подкаталогов: среди них /bin, /etc, /dev, и /usr. Эти каталоги в свою очередь содержат другие каталоги, которые содержат системные конфигурационные файлы, программы и т.д.
В частности, каждый пользователь имеет домашний каталог, который выделяется пользователю для хранения его файлов. В вышеприведенном примере все файлы Larry (такие как cheat-sheet и history-final) содержались в домашнем каталоге Larry. Обычно пользовательский домашний каталог находится под каталогом /home и называется именем пользователя. Так домашний каталог Larry будет /home/larry.
На Рис. 3.2.8 представлено простое дерево каталогов. Оно даст вам некоторое представление о том, как организуется дерево каталогов в вашей системе.
3.2.9 Текущий рабочий каталог
Команды, которые вы даете shell, выдаются из вашего текущего каталога. Вы можете думать о вашем рабочем каталоге, как о каталоге в котором вы находитесь. При начальном входе в систему вашим рабочим каталогом автоматически становится домашний каталог (в нашем случае /home/larry). При обращении к файлу вы можете обращаться к нему с учетом вашего местоположения, вместо того, чтобы указывать полный путь.
/_____bin
|_dev
|_etc
|_home_____larry
| |_sam
|_lib
|_proc
|_tmp
|_usr__X386
|_bin
|_emacs
|_etc
|_g++-include
|_include
|_lib
|_local_____bin
| |_emacs
| |_etc
| |_lib
|_man
|_spool
|_src_____linux
|_tmp
Рис 3.1: Типичное (урезанное) дерево каталогов Unix
Вот например, у Larry есть каталог papers, а papers содержит файл history-final. Если Larry хочет посмотреть этот файл, он может использовать команду
/home/larry# more /home/larry/papers/history-final
Команда more просто показывает файл на экране порциями. Поскольку текущий рабочий каталог Larry /home/larry, он вместо этого может обратиться к файлу с учетом своего текущего местоположения. Команда будет
/home/larry# more papers/history-final
Так что вы можете начинать имя файла (такого как papers/final) с символа, отличного от ``/'', система предполагает, что вы обращаетесь к файлу с учетом вашего текущего рабочего каталога. Это называют относительным именем (а полный маршрут - полное (абсолютное) имя - т.е. путь от корня до данного имени).
3.2.10 Обращение к домашнему каталогу
Оболочки (shell), т.е. программы, которые читают и выполняют команды пользователя, могут использоваться (одновременно в одной системе) разные. В большинстве систем Linux используются tcsh или bash при начальной регистрации в системе. В tcsh и bash вы можете обратиться к своему домашнему каталогу, используя тильду (``~''). Например, команда
/home/larry# more ~/papers/history-final
эквивалентна
/home/larry# more /home/larry/papers/history-final
Символ ``~'' просто заменяет имя вашего домашнего каталога.
Вы также можете обратиться к домашнему каталогу другого пользователя с помощью тильды. Имя ``~karl/letters'' будет интерпретировано shell, как ``/home/karl/letters'' (если /home/karl - домашний каталог для пользователя karl). Использование тильды упрощает обращение; не существует каталога с именем ``~'' - так что это просто "синтаксический сахар", который имеется в распоряжении shell.
3.3 Первые шаги в UNIX
Перед тем, как начать, важно заметить, что все имена файлов и команд чувствительны к большим и малым буквам (чего нет в системах типа MS-DOS). Например, команда make очень отличается от Make или MAKE. То же относится и к именам каталогов.
3.3.1 Первая прогулка
Теперь мы можем войти в систему и узнать, как обращаться к файлам и менять местоположение в файловой системе, чтобы упрощать свою жизнь в ней. Команда для перемещения по дереву каталогов - cd, (``change directory''). Вы скоро обратите внимание, что многие часто используемые команды Unix состоят из двух-трех букв. Формат команды cd:
cd <directory>
где <directory> - имя каталога, в который вы желаете перейти. Как мы уже говорили, когда вы входите в систему, вы автоматически оказываетесь в своем домашнем каталоге. Если Larry желает двинуться ниже по дереву, он должен использовать команду
/home/larry# cd papers
/home/larry/papers#
Как видите, изменилась подсказка, отразив изменение местоположения (новый рабочий каталог). Теперь он в каталоге papers и может посмотреть на свой файл history-final с помощью команды
/home/larry/papers# more history-final
Чтобы вернуться назад из подкаталога papers, надо использовать команду
/home/larry/papers# cd ..
/home/larry#
(Обратите внимание на пробел между ``cd'' и ``..''). Каждый каталог содержит имя ``..'' , которое отсылает к родительскому (для данного каталога) каталогу. Также каждый каталог имеет имя ``.'', которое ссылается на него самого. Поэтому команда
/home/larry/papers# cd .
никуда не переведет.
В команде cd вы можете использовать маршруты. Чтобы перейти в домашний каталог Карла, вы можете воспользоваться командой
/home/larry/papers# cd /home/karl
/home/karl#
Используя команду cd без аргументов вы из любого места дерева вернетесь в свой домашний каталог.
/home/karl# cd
/home/larry#
3.3.2 Разглядывание содержимого каталогов
Теперь вы знаете, как ходить-бродить по каталогам, но вероятно возникает вопрос: "Ну и что с того?" Само по себе хождение по каталогам бесполезно, давайте познакомимся с новой командой ls. ls (LiSt) выдает на экран перечень файлов и каталогов (по умолчанию из текущего каталога). Например,
/home/larry# ls
Mail
letters
papers
/home/larry#
Здесь мы видим, что у Larry три "единицы хранения" в его текущем каталоге: Mail, letters и papers. Но это мало, что говорит: каталоги это или файлы? Можно использовать опцию (прим. переводчика: часто в документации по UNIX используют в этом контексте слово "флаг") -F в команде ls, чтобы получить больше информации.
/home/larry# ls -F
Mail/
letters/
papers/
/home/larry#
Приписанные справа к именам файлов / говорят о том, что это (под)каталоги.
Использование ls -F (обратите внимание "-F" пишется без пробела) может дать также ``*'' в конце некоторых имен файлов. Это будет говорить о том, что это выполняемые файлы или программы. Если, при вызове ls -F, ничего справа не приписано к имени, то это "нормальный" файл, т.е. не каталог и не выполняемый файл.
В общем, каждая команда UNIX может иметь несколько опций в дополнение к другим аргументам. Эти опции обычно записываются со знаком ``-'', как это было показано на примере ls -F. Опция -F сообщает команде ls, что необходимо выдать дополнительную информацию о типе файлов.
Если вы напишете в команде ls имя каталога, то она выдаст содержимое указанного каталога.
/home/larry# ls -F papers
english-lit
history-final
masters-thesis
notes/
/home/larry#
Или, чтобы было интереснее, давайте посмотрим, что имеется в системном каталоге /etc/.
/home/larry# ls /etc
Images ftpusers lpc rc.new shells
adm getty magic rc0.d startcons
bcheckrc gettydefs motd rc1.d swapoff
brc group mount rc2.d swapon
brc~ inet mtab rc3.d syslog.conf
csh.cshrc init mtools rc4.d syslog.pid
csh.login init.d pac rc5.d syslogd.reload
default initrunlvl passwd rmt termcap
disktab inittab printcap rpc umount
fdprm inittab.old profile rpcinfo update
fstab issue psdatabase securetty utmp
ftpaccess lilo rc services wtmp
/home/larry#
(Для вышедших из MS-DOS пользователей полезно обратить внимание, что имена файлов могут быть длиннее 8 символов и содержать точку на любой позиции. Можно даже использовать несколько точек в одном имени).
Давайте поднимемся вверх по дереву (прим. переводчика: так уж сложилось, что в UNIX начальной вершиной дерева является "корень (root)") , используя команду ``cd ..'', а затем спустимся в другой каталог (/usr/bin ).
/home/larry# cd ..
/home# cd ..
/# cd usr
/usr# cd bin
/usr/bin#
Вы, разумеется, можете передвигаться по каталогам большими шагами, например, сразу выполнить cd /usr/bin.
Постарайтесь погулять по каталогам, используя команды ls и cd. В некоторых случаях вы можете напороться на раздражающее сообщение ``Permission denied''(обращение запрещено). Это всего лишь сработала система защиты UNIX, чтобы выполнять команды в тех или иных каталогах вы должны иметь на это разрешение. Подробнее об этом поговорим в Разделе 3.9.
3.3.3 Создание новых каталогов
Пора познакомиться с тем, как создавать каталоги. Это связано с использованием команды mkdir. Попробуйте следующее:
/home/larry# mkdir foo
/home/larry# ls -F
Mail/
foo/
letters/
papers/
/home/larry# cd foo
/home/larry/foo# ls
/home/larry/foo#
Наши вам поздравления! Вы только что создали новый каталог и зашли в него. Поскольку пока нет файлов в этом новом каталоге, давайте познакомимся с тем, как копировать файлы.
3.3.4 Копирование файлов
Копирование файлов осуществляется командой cp (CoPy):
/home/larry/foo# cp /etc/termcap .
/home/larry/foo# cp /etc/shells .
/home/larry/foo# ls -F
shells termcap
/home/larry/foo# cp shells bells
/home/larry/foo# ls -F
bells shells termcap
/home/larry/foo#
Команда cp копирует файлы, перечисленные в командной строке, в файл или каталог, указанный последним аргументом. (прим. переводчика: несколько файлов одной командой cp можно скопировать только в каталог; в файл можно скопировать только один файл). Обратите внимание на то, как мы используем каталог ``.''для ссылки на текущий каталог.
3.3.5 Перемещение файлов
Новая команда с именем mv (MoVe) перемещает файлы вместо их копирования. Синтаксис команды очевиден.
/home/larry/foo# mv termcap sells
/home/larry/foo# ls -F
bells sells shells
/home/larry/foo#
Обратите внимание, что теперь termcap уже не существует, а на его месте файл sells. Это можно использовать для переименования файлов, что мы сейчас и сделали. Но можно и переносить файлы в совсем другие каталоги.
Внимание! Команды mv и cp уничтожат содержимое файла в который они пишут (если он существовал), не спрашивая вашего разрешения. Будьте внимательны, когда вы переносите файл в другой каталог: там уже может существовать файл с таким именем и вы его затрете.
3.3.6 Удаление файлов и каталогов
Мы тут с вами "нарифмовали" ненужных файлов, изучая работу команды ls. Для удаления файлов используется команда rm (ReMove).
/home/larry/foo# rm bells sells
/home/larry/foo# ls -F
shells
/home/larry/foo#
У нас ничего не осталось, кроме shells, но не будем переживать. Обратите внимание, что команда rm не будет вас переспрашивать перед удалением, так что будьте осторожны.
Родственная rm команда rmdir. Эта команда удаляет каталоги, но только пустые каталоги. Если в каталоге есть хоть какие-нибудь файлы или подкаталоги, она распишется в бессилии.
3.3.7 Рассматривание файлов
Команды more и cat используются для просмотра содержимого файлов. more выдает файл на дисплей "поэкранно", в то время, как cat выдает весь файл разом. (прим. переводчика: если файл многострочный, то, при использовании команды cat файл промелькнет и на экране останутся последние строки).
Чтобы посмотреть файл shells, используем команду
/home/larry/foo# more shells
При использовании команды more нажимайте клавишу пробел для перехода к следующей странице и b для возврата к предыдущей. Нажав q, вы выйдете из more.
А теперь попробуйте команду cat etc/termcap/. Текст промелькнет слишком быстро, чтобы успеть его прочитать. На самом деле команда ``cat'' (conCATenate) в основном используется для других целей, для той же конкатенации нескольких файлов. Это в дальнейшем будет обсуждаться.
3.3.8 Получение оперативной помощи
Практически каждый UNIX имеет то, что называется "Руководство" - man ( ``manual pages''). Эта команда man содержит документацию на различные команды системы, ресурсы, конфигурационные файлы. Например, если вы хотите найти информацию о других опциях команды ls, введите
/home/larry# man ls
и вам на экран будут выведены страницы Руководства.
К сожалению, большинство страниц руководства написаны с ориентацией на пользователей, имеющих некоторые представления о работе соответствующих команд. Поэтому страницы Руководства обычно содержат справочные данные по командам, а не учебный материал.
Но Руководство неоценимо для освежения памяти, если вы забыли синтаксис команды. Руководство может также много рассказать вам о командах, которые мы даже не упомянем в этой книге.
Я предлагаю вам посмотреть в Руководстве те команды, которые мы уже обсуждали и все, с которыми мы будем встречаться. Вы обнаружите, что не на все команды есть Руководство. Тому несколько причин. Одна - некоторые страницы Руководства еще просто не написаны (the Linux Documentation Project - программа подготовки документации для Linux как бы отвечает за решение этой проблемы. Мы уже собрали большую часть документации). Во-вторых, команда может быть внутренней командой shell или синонимом (alias), что обсуждалось в Разделе 3.2.4, в каждом из этих случаев для них нет собственных страниц. Возьмем для примера cd, которая является внутренней командой shell. Shell выполняет эту команду, но она не имеет своей отдельной программы.
3.4 Краткая информация о базовых командах
Этот раздел представляет некоторые наиболее полезные базовые команды UNIX, включая те, о которых говорили в предыдущем разделе.
Обратите внимание, что опции обычно начинаются с ``-'' и во многих случаях несколько однобуквенных опций могут следовать за одним минусом, записанные слитно. Например, вместо использования ls -l -F, можно использовать ls -lF.
Вместо перечисления всех возможных опций каждой команды, мы будем говорить только о тех, которые полезны или важны в данное время. Действительно, большинство из этих команд имеет большое число опций (большинство из которых никогда не используется). Вы можете для каждой команды с помощью man посмотреть все возможные опции.
Обратите также внимание на то, что многие из команд берут список файлов или каталогов, как аргументы, обозначенные как ``<file1> ... <fileN>''. Например, команда cp берет в качестве аргументов список файлов, которые надо копировать, за которыми следует имя целевого файла или каталога. При копировании нескольких файлов в качестве целевого может выступать только каталог.
cd
Изменяет текущий рабочий каталог.
Синтаксис: cd <directory>;
<directory> - каталог, в который перейти (``.'' ссылается на текущий каталог, ``..'' - на родительский каталог).
Пример: cd ../foo переводит из текущего каталога в ../foo.
ls
Выдает информацию о файлах в каталоге.
Синтаксис: ls <file1> ... <fileN>
Где <file1> ... <fileN> имена файлов или каталогов, информацию про которые надо выдать.
Опции: Здесь больше опций, чем вы думаете. Наиболее часто используемые: -F (для представления информации о типах файлов), и -l (выдает в длинном (``long'') формате информацию о размерах файлов, владельцах, правах доступа и т.д. В деталях это будет обсуждаться далее).
Пример: ls -lF /home/larry выдаст содержимое каталога /home/larry.
cp
Копирует файл(ы) в файл или каталог.
Синтаксис: cp <file1> ... <fileN> <destination>
Где <file1> ... <fileN> имена копируемых файлов, а <destination> файл или каталог, в который копируют.
Пример: cp ../frog joe копирует файл ../frog в файл или каталог joe.
mv
Перемещает файл(ы) в другой файл или каталог. Эта команда не эквивалентна копированию с последующим уничтожением оригинала. Она может быть использована для переименования файлов, как команда RENAME из MS-DOS.
Синтаксис: mv <file1> ... <fileN> <destination>
Где <file1> ... <fileN> имена перемещаемых файлов, а <destination> имя файла или каталога, в который перемещают.
Пример: mv ../frog joe перемещает файл ../frog в файл или каталог joe.
rm
Удаляет файлы. Имейте в виду, когда в UNIX удаляются файлы, они невосстановимы (не как в MS-DOS, где вы можете "разудалить" файл).
Синтаксис: rm <file1> ... <fileN>
Где <file1> ... <fileN> имена удаляемых файлов.
Опции: -i потребует вашего подтверждения перед удалением файла.
Пример: rm -i /home/larry/joe /home/larry/frog удаляет файлы joe и frog в каталоге /home/larry.
mkdir
Создает новые каталоги.
Синтаксис: mkdir <dir1> ... <dirN>
Где <dir1> ... <dirN> создаваемые каталоги.
Пример: mkdir /home/larry/test создает каталог test в каталоге /home/larry.
rmdir
Эта команда удаляет пустые каталоги. При использовании rmdir ваш текущий рабочий каталог должен находиться вне удаляемого каталога.
Синтаксис: rmdir <dir1> ... <dirN>
Где <dir1> ... <dirN> удаляемые каталоги.
Пример: rmdir /home/larry/papers удаляет каталог /home/larry/papers, если он пустой.
man
Выдает страницу Руководства по данной команде или ресурсу. (здесь "ресурс" - это любая системная утилита, которая не является командой, например библиотечная функция).
Синтаксис: man <command>
Где <command> имя команды или ресурса, о котором запрашивается информация.
Пример: man ls - дает помощь по команде ls.
more
Выдает содержимое названных файлов поэкранно.
Синтаксис: more <file1> ... <fileN>
Где <file1> ... <fileN> отображаемые файлы.
Пример: more papers/history-final представляет файл papers/history-final.
cat
Используется для конкатенации файлов. cat используется также для выдачи полного содержания файла разом
Синтаксис: cat <file1> ... <fileN>
Где <file1> ... <fileN> выдаваемые файлы.
Пример: cat letters/from-mdw выдает на дисплей файл letters/from-mdw.
echo
Просто повторяет аргументы.
Синтаксис: echo <arg1> ... <argN>
Где <arg1> ... <argN> "повторяемые" аргументы.
Пример: echo "Hello world" выдает на экран ``Hello world''.
grep
выдает все строки в названном файле(лах), которые содержат заданный образец.
Синтаксис: grep <pattern> <file1> ... <fileN>
Где <pattern> - образец (представленный регулярным выражением) и <file1> ... <fileN> - файлы, в которых производится поиск.
Пример: grep loomer /etc/hosts выдаст все строки, в которых файл /etc/hosts, содержит образец ``loomer''.
3.5 Исследование файловой системы
Файловая система есть собрание файлов и иерархия каталогов. Я обещал поводить вас по файловой системе - и время настало. У вас достаточно интеллекта и знаний извлечь пользу из того, что я говорю и у вас есть карта дорог. (Смотрите Рис. 3.2.8).
Перво-наперво вернемся в корневой каталог (cd /) и сделаем ls -F. Вы, очевидно, увидите каталоги: bin, dev, etc, home, install, lib, mnt, proc, root, tmp, user, usr и var. (Можете увидеть и несколько отличный вариант - не волнуйтесь, различные версии Linux могут иметь отличия).
Присмотримся к каждому каталогу.
/bin
bin - это сокращенно от ``binaries'' (т.е. двоичные или выполняемые файлы). Здесь находится много важных системных программ. Используйте команду ``ls -F/bin'' чтобы посмотреть имеющийся здесь список файлов. Вы можете обнаружить здесь уже знакомые вам команды, вроде cp, ls и mv. Это и есть программы соответствующих команд. Когда, например, вы используете команду cp, вы выполняете программу /bin/cp.
Используя ls -F, вы увидите, что большинство (если не все) файлов в /bin имеют справа от имени звездочку (``*''). Это говорит о том, что файлы выполняемые, как описано в Разделе 3.3.2.
/dev
Следующая остановка на нашем пути - dev. Вновь посмотрите на содержимое с помощью ls -F.
"Файлы" в /dev известны как драйверы устройств - они используются для доступа к устройствам и ресурсам системы, таким как диски, модемы, память и т.д. Например, как вы можете читать данные из файла, точно также вы можете читать входные сигналы от мыши, имея доступ к /dev/mouse. Имена файлов, начинающиеся на fd - это дисководы гибких дисков. fd0 - первый дисковод, fd1 - второй. Теперь самые шустрые из вас заметят, что здесь имеется больше дисководов, чем те два, которые мною упоминались: они представляют специфические типы дисководов. Например, fd1H1440 представляет доступ к high-density, 3.5" дискетам на дисководе 1.
Вот перечень некоторых из наиболее используемых файлов устройств.
/dev/console/ относится к системной консоли, т.е. к монитору, напрямую связанному с системой.
Различные /dev/ttyS и /dev/cua устройства используются для доступа к последовательным портам. Например, /dev/ttyS0 относится к ``COM1'' под MS-DOS. Устройства /dev/cua относятся к "звонящим" (``callout'') устройствам, которые используются совместно с модемами.
Устройства, имена которых начинаются с hd, имеют доступ к жестким дискам. /dev/hda относится ко всему первому жесткому диску, а hda1 только к первому разделу /dev/hda.
Устройства с именами, начинающимися на sd - SCSI-драйверы. Если у вас SCSI жесткий диск, вместо доступа к нему через /dev/hda, вы будете обращаться к /dev/sda. SCSI ленты доступны через устройства st, а SCSI CD-ROM через sr.
Устройства lp обеспечивают доступ к параллельным портам. /dev/lp0 относится к ``LPT1'' в MS-DOS.
/dev/null используется как "черная дыра" - любые данные, посланные сюда, канут в Лету. Если вы хотите подавить вывод команды на экран, вы можете перенаправить этот вывод в /dev/null. Мы об этом позже еще поговорим.
Устройства с именами /dev/tty относятся к "виртуальным консолям" вашей системы (доступ путем нажатия alt-F1, alt-F2 и т.д.). /dev/tty1 соответствует первой VC, /dev/tty2 соответствует второй и т.д.
Устройства, чьи имена начинаются на /dev/pty, это "псевдотерминалы". Они используются для входа с удаленных "терминалов". Например, если ваша машина в сети, вход к вам по telnet будет использовать одно из устройств /dev/pty.
/etc
/etc содержит множество всевозможных системных файлов конфигурации. Они включают /etc/passwd (файл паролей), /etc/rc (командный файл инициализации) и т.д.
/sbin
/sbin используется для хранения важных системных двоичных файлов, используемых системным администратором.
/home
home содержит домашние каталоги пользователей. Например, /home/larry - домашний каталог пользователя ``larry''. На вновь инсталлированной системе этот каталог может быть пуст в связи с временным отсутствием зарегистрированных пользователей.
/lib
/lib содержит образы разделяемых библиотек (shared library images). Эти файлы содержат код, который могут использовать многие программы. Вместо того, чтобы каждая программа имела свою собственную копию этих выполняемых файлов, они хранятся в одном общедоступном месте - в /lib. Это позволяет сделать выполняемые файлы меньше и сэкономит место в системе.
/proc
/proc - это "виртуальная файловая система", в которой файлы хранятся в памяти, а не на диске. Они связаны с различными процессами, происходящими в системе, и позволяют получить информацию о том, что делают программы и процессы в указанное время. Более детально мы рассмотрим это в Разделе 3.11.1.
/tmp
Многие программы нуждаются в создании рабочих файлов, которые нужны короткое время. Каноническое место для этих файлов в /tmp (там обычно чаще проводится уборка мусора).
/usr
/usr - это очень важный каталог. Он состоит из ряда подкаталогов, которые в свою очередь содержат наиболее важные и полезные программы и файлы конфигурации, используемые системой.
Различные каталоги, описанные выше, необходимы для нормального функционирования системы, но большинство вещей, содержащихся в /usr необязательны для системы. Но это такие необязательные вещи, которые делают систему полезной и интересной. Без /usr вы бы имели достаточно занудную систему, содержащую только программы, вроде cp и ls. /usr содержит много больших программных пакетов и конфигурационных файлов, которые их сопровождают.
/usr/X386
/usr/X386 содержит The X Window System, если вы ее инсталлировали. The X Window System - это мощная графическая среда, которая содержит большое количество графических утилит и программ, отображающих "окна" на вашем экране. Если вы знакомы с Microsoft Windows или Macintosh environments, то X Windows будет выглядеть весьма похоже. Каталог /usr/X386 содержит все выполняемые и конфигурационные файлы X Window, а также файлы поддержки. Более детально это будет обсуждаться в Разделе 5.1.
/usr/bin
/usr/bin настоящее хранилище для различных программ UNIX. Он содержит большинство выполняемых программ, которых нет ни в каких других местах, например, в том же /bin их нет.
/usr/etc
Точно также, как и /etc, содержит всевозможные системные программы и конфигурационные файлы. /usr/etc содержит даже больше утилит и файлов. В общем, файлы, находящиеся в /usr/etc несущественны для системы, в отличие от тех, которые находятся в /etc, и очень существенны.
/usr/include
/usr/include содержит include-файлы для компилятора Си. Эти файлы (большинство имен которых заканчивается на .h (от слова ``header'') объявляют имена структур данных, подпрограмм и констант, используемых при написании программ на Си. Те файлы, которые находятся в /usr/include/sys в общем случае используются при программировании на системном уровне UNIX. Если вы знакомы с языком программирования Си, здесь вы найдете такие хэдеры (фрагменты программ, вставляемые обычно в начало программы), stdio.h, которые описывают такие функции, как printf().
/usr/g++-include
/usr/g++-include содержит include-файлы для компилятора Cи++ (очень похожие на /usr/include).
/usr/lib
/usr/lib содержит библиотеки-"заглушки" и "статические" библиотеки, эквивалентные файлам из /lib. При компиляции программа "связывается" с библиотеками, находящимися в /usr/lib, которые в свою очередь направляют программы обращаться в /lib, если им нужен актуальный код. Кроме того, многие другие программы хранят в /usr/lib свои конфигурационные файлы.
/usr/local
/usr/local в большой степени похож на /usr - он содержит различные программы и файлы, несущественные для системы, но превращающие ее в удовольствие и восторг. В общем, эти программы, находящиеся в /usr/local специализируются на специфике вашей системы, т.е. /usr/local сильно отличается в различных UNIX. Здесь вы найдете такие большие программные пакеты, как TeX (система форматирования документов) и Emacs (большой и мощный редактор), если вы их установите.
/usr/man
Этот каталог содержит страницы Руководства. Здесь два подкаталога для каждого "раздела" Руководства. (С помощью команды "man man" вы можете получить более подробную информацию). Например, /usr/man/man1 содержит исходные тексты (неотформатированный оригинал) страниц Руководства в разделе 1 и /usr/man/cat1 содержит отформатированные страницы для раздела 1.
/usr/src
/usr/src содержит исходные коды (неоткомпилированные программы) для различных программ вашей системы. Наиболее важная вещь здесь, это /usr/src/linux, содержащий исходные коды ядра Linux.
/var
/var содержит каталоги, которые часто меняются в размере или имеют тенденцию быстро расти. Многие из этих каталогов "квартировались" в /usr, но поскольку мы стремимся сделать его достаточно стабильным, каталоги, которые часто меняются были перенесены в /var. К числу таких каталогов относятся:
/var/adm
/var/adm содержит различные файлы, интересные системному администратору, специфические системные файлы, фиксирующие ошибки и проблемы, возникающие в системе. Другие файлы фиксируют входы в систему, как и неудачные попытки войти. Это будет обсуждаться в Главе 4.
/var/spool
/var/spool содержит файлы, которые предварительно формируются для других программ. Например, если ваша машина подключена к сети, входная почта будет помещаться в /var/spool/mail до тех пор, пока вы не прочитаете ее или не удалите. Входящие и исходящие новости помещаются в /var/spool/news и т.д.
3.6 Типы оболочек
Как я уже много раз говорил, UNIX - это многозадачная, многопользовательская операционная система. Многозадачность очень полезна - однажды привыкнув к ней, вы будете всегда ее использовать. Прежде всего, вы сможете выполнять задачи в фоновом режиме, переключать задачи и объединять их в конвейер, достигая сложных результатов простыми средствами.
Многие из возможностей, которые мы будем обсуждать в этом разделе, обеспечиваются самой оболочкой (shell). Будьте внимательны, не путайте UNIX (фактическую операционную систему) с оболочкой - оболочка, это лишь интерфейс с находящейся за ней системой. Оболочка обеспечивает выполнение громадного числа функций помимо собственно UNIX.
Оболочка - это не только интерпретатор интерактивных команд, которые вы можете ввести, получив от оболочки подсказку (готовности принимать команды). Это также мощный командный язык, который позволяет писать программы (shell-scripts), объединяющие несколько команд в командный файл. Пользователи MS-DOS почувствуют здесь нечто схожее с ``batch-файлами''. Использование программ на языке оболочки (shell) - это очень мощное средство, которое позволяет автоматизировать и и существенно повысить эффективность использования UNIX. Смотрите дополнительно в Разделе 3.13.1.
Существует несколько типов оболочек в мире UNIX. Две главные - это ``Bourne shell''(shell Баурна) и ``C shell'. Shell Баурна (или просто shell) использует командный синтаксис, похожий на первоначально для UNIX придуманный (вроде UNIX System III). В большинстве UNIX-систем shell Баурна имеет имя /bin/sh (где sh сокращение от ``shell''). C shell использует иной синтаксис, чем-то напоминающий синтаксис языка программирования Си. В большинстве UNIX-систем он имеет имя /bin/csh.
В Linux есть несколько вариаций этих оболочек. Две наиболее часто используемые, это Новый Shell Баурна (Bourne Again Shell) или ``Bash'' (/bin/bash) и Tcsh (/bin/tcsh). Bash - это развитие прежнего shell с добавлением многих полезных возможностей, частично содержащихся в C shell. Поскольку Bash можно рассматривать как надмножество синтаксиса прежнего shell, любая программа, написанная на добром старом shell Баурна должна работать и в Bash. Для тех, кто предпочитает использовать синтаксис C shell, Linux поддерживает Tcsh, который является расширенной версией C shell.
Тип оболочки, которую вы решили использовать - это почти как выбор религии. Некоторые предпочитают синтаксис shell Баурна с дополнительными возможностями, предоставляемыми Bash, а некоторые - более структурированный синтаксис C shell. Для "нормальных" команд, таких как cp и ls, тип используемого вами shell никакой роли не играет. Только когда вы начнете писать командные файлы или использовать некоторые новые свойства оболочек, различия между ними становятся существенными.
При обсуждении далее некоторых свойств оболочек мы будем обращать внимание на различие между Баурновским shell и C shell. (Если вам это действительно очень интересно, почитайте Руководство по поводу bash и tcsh).
3.7 "Уайлдкард" - "дикая карта"
Ключевое свойство большинства оболочек Unix - это способность ссылаться сразу более, чем на один файл, используя для этого специальные символы. Эти, так называемые "дикие карты" (wildcards), позволяют ссылаться, скажем, на все файлы, содержащие символ "n". (прим. переводчика: Мне не известен хороший перевод этой идиомы (wildcards), наиболее часто у нас встречается "генераторы" и "расширители" символов - но это тяжеловато. Чтобы далее не испытывать мучений - буду использовать слово "уайлдкард". Кстати, и оболочку удобнее далее именовать как shell, так легче воспринимается то, что это язык программирования).
Уайлдкард ``*'' относится к любому символу или строке символов в имени файла. Например, когда вы используете символ ``*'' в имени файла shell заменяет ее всеми возможными именами файлов из каталога, на который вы ссылаетесь. Вот простенький пример. Предположим, что Larry имеет файлы frog, joe и stuff в своем текущем каталоге:
/home/larry# ls
frog joe stuff
/home/larry#
Для обращения сразу ко всем файлам с буквой ``o'' в имени, мы можем использовать команду
/home/larry# ls *o*
frog joe
/home/larry#
Как видите, ``*'' уайлдкард была заменена всеми возможными именами файлов из имевшихся в текущем каталоге.
Использование просто ``*''даст совпадение со всеми именами, поскольку все символы совпадают с уайлдкард.
/home/larry# ls *
frog joe stuff
/home/larry#
Вот еще несколько примеров.
/home/larry# ls f*
frog
/home/larry# ls *ff
stuff
/home/larry# ls *f*
frog stuff
/home/larry# ls s*f
stuff
/home/larry#
Процесс замены ``*'' на имена файлов называется расширением уайлдкард и выполняется shell. Это важно: конкретные команды, вроде ls, никогда не видят ``*'' в своем списке параметров. Shell, расширяя уайлдкард, включает в список параметров все имена, прошедшие сравнение с шаблоном. Так что команда
/home/larry# ls *o*
расширяется shell до фактической
/home/larry# ls frog joe
Одно важное замечание относительно ``*'' уайлдкард. Использование этой уайлдкард не даст совпадения с именами файлов, которые начинаются с точки (``.''). Эти файлы воспринимаются как "спрятанные", хотя на самом деле их никуда не прятали. Они не показываются в списке, выдаваемом нормальной командой ls и не выбираются при использовании ``*'' уайлдкард.
Вот пример. Мы уже упоминали, что каждый каталог имеет два специальных файла: ``.'' - указание на текущий каталог и ``..'' - указание на родительский каталог. Однако, если вы используете команду ls, эти два файла не будут отображены.
/home/larry# ls
frog joe stuff
/home/larry#
Если вы используете опцию -a в команде ls, то вы сможете отобразить имена, начинающиеся на ``.'':
/home/larry# ls -a
. .. .bash_profile .bashrc frog joe
stuff
/home/larry#
Как видим, два специальных файла ``.'' и ``..'', также, как два других "спрятанных" файла - .bash_profile и .bashrc. Эти два файла используются при входе larry в систему. Более подробно о них в Разделе 3.13.3.
Обратите внимание, что когда мы используем ``*'' уайлдкард, ни один из файлов, с именами, начинающимися на ``.'' не отображается.
/home/larry# ls *
frog joe stuff
/home/larry#
Это мера предосторожности: если ``*'' уайлдкард выбирала бы имена файлов, начинающиеся на ``.'', она бы также выбрала имена ``.'' и ``..''. Но это может быть опасно при выполнении ряда команд.
Другой уайлдкард является ``?''. ``?'' уайлдкард позволяет подставить строго один символ. Так ``ls ?'' выдаст на только имена файлов, состоящие из одного символа, а ``ls termca?'' выдаст ``termcap'', но не выдаст на экран ``termcap.backup''. Вот еще один пример:
/home/larry# ls j?e
joe
/home/larry# ls f??g
frog
/home/larry# ls ????f
stuff
/home/larry#
Как видите, уайлдкард позволяет описывать много файлов за один раз. При обзоре простейших команд в Разделе 3.4 мы говорили, что команды cp и mv могут копировать или перемещать множества файлов за один раз. Например,
/home/larry# cp /etc/s* /home/larry
скопирует все файлы в /etc , начиная с ``s''в каталог /home/larry. Формат команды cp на самом деле
cp <file1> ... <fileN> <destination>
где <file1> ... <fileN> - список копируемых файлов, а <destination> это файл или каталог, в который производится копирование. mv имеет аналогичный синтаксис.
Обратите внимание, что если производится копирование или перемещение более, чем одного файла, <destination> должен быть каталогом. В файл скопировать или переместить можно только один файл.
3.8 Трубопроводы UNIX
3.8.1 Стандартный вход и стандартный выход
Многие команды UNIX получают информацию с так называемого стандартного входа и посылают информацию на (опять же) так называемый стандартный выход. (Для них часто используются сокращения ``stdin'' и ``stdout'' соответственно). Ваш shell организует дело так, что стандартным входом служит клавиатура, а стандартным выходом - экран.
Вот пример использования команды cat. Нормально cat читает данные из файлов, чьи имена даны в командной строке и посылает эти данные прямехонько на stdout. Поэтому при выполнении команды
/home/larry/papers# cat history-final masters-thesis
на экран пойдет файл history-final, а за ним следом masters-thesis.
Но если команде cat не даны имена файлов в качестве параметров, она читает данные с stdin и опять же посылает на stdout. Вот пример.
/home/larry/papers# cat
Hello there.
Hello there.
Bye.
Bye.
[ctrl-D]
/home/larry/papers#
Как видите, каждая строка, которую напечатал пользователь, немедленно выдается командой cat на экран. При вводе со стандартного входа команда знает, что ввод закончен тогда, когда она получит в каком-то виде сигнал EOT (End-Of-Text). Обычно он обеспечивается нажатием ctrl-D.
Вот другой пример. Команда сортировки sort читает построчно текст (здесь опять с stdin, поскольку имена файлов в параметрах не указаны, и посылает отсортированный результат на stdout. Попробуйте так.
/home/larry/papers# sort
bananas
carrots
apples
[ctrl-D]
apples
bananas
carrots
/home/larry/papers#
Теперь мы можем упорядочить наш список продуктов, подлежащих закупке, в лексикографическом порядке... ну разве UNIX не полезная вещь?