Использование Slackware Linux

5.1  Оболочка Shell

В графической среде интерфейс представляется программой, которая рисует окна, линии прокрутки, меню, и т.д. В режиме командной строки интерфейс управляется оболочкой (англ. shell), которая интерпретирует команды и вообще делает вещи пригодными к применению. Сразу после входа в систему (который описывается в этом разделе), пользователи попадают в оболочку, и могут делать там то, что они хотят. Этот раздел является введением по оболочке в общем, и так же описывает наиболее распространённую среди пользователей Linux оболочку - Bourne Again Shell, или просто bash. Для получения дополнительной информации по всем рассмотренным в этом разделе вопросам, обращайтесь к man странице bash(1).

5.1.1  Пользователи

Вход в систему

Итак, вы загрузились, и перед вами что-то вроде:

Welcome to Linux 2.2.14
darkstar login:

Хм... никто нам ничего не говорил о login. И что такое darkstar? Не волнуйтесь; скорее всего, вы не соединились через гиперпространственную comm-link связь с искусственной луной Империи. (Боюсь, гиперпространственный comm-link ещё не поддерживается Linux ядром :) Нет, drackstar это просто имя одного из наших компьютеров, и его имя устанавливается по умолчанию. Если во время установки вы изменили имя вашего компьютера, то вы увидите его в приглашении входа, вместо drackstar.

Так что же там про login... Если это ваш первый вход в систему, вам необходимо войти в систему, как root пользователь. Вас спросят пароль; если вы указали пароль при установке, то введите его. Если нет, просто нажмите ввод. Ну вот, вы вошли в систему!

Root: суперпользователь

Итак, кто или что такое ''root''? И что он имеет общего с системой?

Ну, в мире Unix и аналогичных системах (таких, как Linux), есть пользователи и ещё пользователи. Мы вернёмся к более подробному обсуждению позже, но важно знать, что пользователь root, это самый главный пользователь; это всезнающий и все-умеющий пользователь и никто не смеет ослушаться ''root'' пользователя. Это просто не дозволенно. Root это тот, кого мы называем суперпользователем и имеем на это полное право. И что самое лучшее, так это, что вы и есть root.

Здорово, не правда ли?

Если вы не уверенны: да, это очень здорово. Что вы должны усвоить, так это то, что root может поломать всё, что угодно, если пожелает. Возможно, вы захотите заскочить вперёд и заглянуть в раздел 5.5 и посмотреть, как добавить пользователя; и войти, как этот пользователь. Мудрость гласит, что лучше всего становится суперпользователем только когда это абсолютно необходимо, чтобы избежать случайных повреждений в системе.

Кстати, если вы вошли в систему, как обычный пользователь, и вам надо выполнить пару команд, как root, вы можете воспользоваться командой su(1). Вас спросят пароль root-а и затем вы им станете, до тех пор, пока не выйдете. При помощи suвы так же можете стать любым другим пользователем вашей системы, если знаете его пароль. Например, su loganсделает вас мной.

5.1.2  Командная строка

Запуск программ

Трудно сделать что либо, без выполнения программ; можно использовать ваш компьютер в качестве подпорки для чего-то, например, для открытой двери, и он будет замечательно жужжать, пока включён, но не больше. И наверное, большинство согласиться со мной, что использование компьютеров в качестве жужжащей подпорки для двери не принесло бы им такой популярности, какую они сейчас приобрели.

Итак, помните, что в Linux почти всё является файлом? Так вот, для программ это тоже справедливо. Каждая команда, которую вы выполняете (если она не встроена в вашу оболочку), соответствует файлу. Вы можете запустить программу, указав полный путь к ней.

Например, помните команду su? Так вот, на самом деле она является файлом, расположенным в /bin каталоге: /bin/suзапустит её.

Почему же тогда простой набор suтак же работает? Вы ведь не указывали путь /bin. Ведь она могла находится и в /usr/share? откуда же компьютер узнал? Ответ в переменной PATH; большинство оболочек имеет PATH или что-то похожее. Она содержит список каталогов, в которых искать программы, которые вы пытаетесь выполнять. Таким образом, когда вы выполнили su, ваша оболочка прошлась по списку каталогов, ища в каждом из них выполняемый файл suи как только она нашла такой файл, она выполняет его. Это случается каждый раз, когда вы запускаете какую либо программу без указания полного пути к ней; если вы получаете сообщение ''Command not found'', это означает, что программы, которую вы пытаетесь запустить нет в каталогах, перечисленных в PATH переменной. (Это так же будет истиной, если программа вообще не существует...) Мы обсудим переменные окружения более детально в разделеthe Bourne Again Shell (bash).

Запомните так же, что ''.'' это сокращение для ''каталог, в котором я сейчас нахожусь'', так что если вы в каталоге /bin, ./suсработает, как полный путь к файлу.

Wildcard Matching (шаблоны имён)

Практически любая оболочка позволяет использовать некоторые символы, подразумевая, ''здесь может быть всё что угодно''. Такие символы называются ''wildcards''; наиболее распространённые из них это ''*'' и ''?''. По соглашению, ''?'' обычно заменяет любой отдельный символ. Например, допустим у вас в каталоге есть файлы: example1.txt, example2.txt и example3.txt. Вы хотите скопировать все эти файлы (при помощи cpпрограммы, которую мы опишем в разделе 5.3 в другой каталог, скажем /tmp. Набирать cp example1.txt example2.txt example3.txt /tmpпотребует слишком много усилий по печатанию всего этого текста. Гораздо проще написать cp example?.txt /tmp; ''?'' будет заменён на все встретившиеся символы ''1'', ''2'' и ''3''.

Что вы говорите? Всё равно слишком много надо печатать? Вы правы. Это ужасно; ведь у нас есть закон о труде, который защищает нас от таких ситуаций. Но к счастью, у нас в арсенале так же есть ''*''. Как уже упоминалось выше, ''*'' заменяет любое число символов, включая их отсутствие. Так что в случае, если кроме упомянутых выше файлов в каталоге ничего нет, мы можем просто сказать cp * /tmpи убьём их все одним выстрелом. Предположим теперь, что в том же каталоге есть файлы example.txt и hejaz.txt. И мы хотим скопировать фалы example, но не hejaz.txt; cp example*.txt /tmpсделает это для нас.

cp example?.txt /tmp, конечно, скопирует только наши первые три файла; в файле example.txt нет символа, подходящего под ''?'', так что этот файл будет оставлен в покое.

Пере-направление ввода/вывода и piping

(Что-то очень интересное здесь.)

$ ps > blargh

Знаете, что это такое? Это я выполняю ps, чтобы посмотреть какие процессы сейчас выполняются; psописана в разделе 5.4. Это не самая интересная часть. Интересная часть вот тут > blargh, что грубо означает, '' возьми вывод psи запиши его в файл, называющийся blargh''. Но подождите, будет ещё интереснее.

$ ps | less

Эта команда берёт вывод psи ''pipes'' (прокачивает) его через less, таким образом, я могу пролистывать его как захочу.

$ ps >> blargh

Это третий из наиболее используемых redirector-ов (пере-направителей); он делает то же, что и '' > '', только '' >> '' добавит вывод psк файлу blargh, если этот файл существует. А если такого файла нет, то сработает просто как '' > '', и создаст файл. ('' > '' в любом случае полностью перепишет содержимое blargh.) Есть так же и оператор '' < '', который означает ''возьмите ввод из следующего источника'', но он не так часто используется.

$ fromdos < dosfile.txt > unixfile.txt

Пере-направление становится действительно забавным, когда вы объединяете операторы:

$ ps | tac >> blargh

Эта команда запустит ps, инвертирует порядок вывода строк, и присоединит их к фалу blargh. Вы можете комбинировать столько операторов, сколько пожелаете; но будьте осторожны и помните, что они интерпретируются с лева направо.

Загляните в man страницу bash(1) для получения более детальной информации по пере-направлению вывода.

5.1.3  The Bourne Again Shell (bash)

Переменные окружения

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

Итак, как объединяющий механизм, пользователи получают то, что называется environment (окружение). Среда окружения определяет условия, в которых выполняется программа; некоторые из этих условий - переменные; пользователь может изменять их и играть с ними. Практически каждая оболочка имеет переменные окружения (если нет, то это наверное не очень удобная оболочка). Здесь мы приведём команды используемые в bashдля оперирования с переменными окружения.

$ set

Сама по себе команда setпокажет вам все переменные окружения, которые определены в данный момент вместе с их значениями. Как и большинство команд, встроенных в bash, она может быть использована для других целей (при указании параметров); мы оставим изучение подробностей, так как они описаны в man странице bash(1). Отрывок вывода команды setна моём компьютере выглядит следующим образом:

PATH=/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:
/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin
PIPESTATUS=([0]="0")
PPID=4978
PS1='\h:\w~$ '
PS2='> '
PS4='+ '
PWD=/home/logan
QTDIR=/usr/local/lib/qt
REMOTEHOST=ninja.tdn
SHELL=/bin/bash

Обратите внимание, на PATH переменную, которую мы обсуждали ранее; я могу выполнять любые программы, находящиеся в каталогах, упомянутых в ней, просто набрав их имя, без указания пути.

$ unset VARIABLE

unsetудалит как содержание указанной в команде переменной, так и саму переменную; bashзабудет, что такая переменная когда либо существовала. (Не волнуйтесь, если это не что-то, что явно было определено в данной сессии оболочки, вероятно оно будет пере-определено при следующей сессии оболочки.)

$ export VARIABLE=some_value

Теперь export, действительно очень полезная команда. С её помощью вы присваиваете переменной VARIABLE значение ''some_value; если VARIABLE не существовала, то она будет создана. Если VARIABLE уже имела какое-то значение, то оно будет потерянно и изменено на новое. Это не есть хорошо, если вы просто пытаетесь добавить имя каталога в PATH. В этом случае вам понадобится команда вроде этой:

$ export PATH=$PATH:/some/new/directory

Обратите внимание на $PATH: когда вы хотите, чтобы bashинтерпретировала переменную (заменяла её на её значение), добавьте $ перед именем переменной. Например, echo $PATHвысветит значение PATH переменной, в моём случае:

$ echo $PATH
/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin: /usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin

Завершение по tab

(Опять что-то интересное.)

Интерфейс командной строчки требует много печатания.

  1. Печатание это работа.
  2. Никто не любит работу.

Из пунктов 3 и 2 мы можем заключить, что 4) никто не любит печатать. К счастью, bashспасает нас от 5 (никто не любит интерфейс командной строки).

Как же bashсправляется с этим, спросите вы? В дополнение к шаблонам имён, обсуждённым выше, bashимеет функцию ''завершение по tab''.

Завершение по tab работает примерно так: Вы набираете имя файла. Может он есть в PATH, а может быть в текущем каталоге. Всё что вам надо, это напечатать достаточную часть имени файла для его однозначной идентификации. Затем нажмите tab кнопку. bashопределит, чего вы хотели и дополнит имя файла за вас!

Время для примера. Каталог /usr/src содержит два под-каталога:/usr/src/linux и /usr/src/sendmail. Я хочу посмотреть, что находится в /usr/src/linux. Я набираю только ls /usr/src/l, нажимаю кнопку TAB, и bashвыдаст мне ls /usr/src/linux.

Теперь, предположим, есть два каталога /usr/src/linux и /usr/src/linux-old; Если я напечатаю /usr/src/lи нажму TAB, bashдополнит столько, сколько сможет, и я получу /usr/src/linux. Я могу остановиться на этом, или нажать TABопять и bashпокажет мне список каталогов, которые подходят под то, что уже напечатано.

Итак, меньше печатания (и пользователям может понравиться интерфейс командной строки). Я же говорил, что это здорово.

5.1.4  Виртуальные терминалы

Итак, вы делаете что-то и вам надо сделать ещё что-то. По идее вы можете просто бросить то, что вы делали и перейти к выполнению другой задачи. Но ведь это же многопользовательская система вроде? И вы можете войти столько раз, сколько пожелаете? Так зачем же выполнять только одну задачу, если параллельно можно выполнять и другую?

Проблема в том, что мы не можем подключить несколько клавиатур, мышек и мониторов к одному и тому же компьютеру; скорее даже большинство из нас просто не захочет этого. Очевидно, что дополнительное оборудование не является решением проблемы. А вот программное обеспечение может помочь, и Linux позволяет это, предлагая ''виртуальные терминалы'', или "VTs".

Нажав Altи функциональную кнопку, вы можете переключать виртуальные терминалы; каждая функциональная клавиша соответствует терминалу. Slackware имеет 6 виртуальных терминалов по умолчанию. Alt+F2переключит вас на второй, Alt+F3на третий, и т.д.

Остальные функциональные клавиши зарезервированы для X сессий. Каждая X сессия использует свой собственный VT, начиная с седьмого (Alt+F7) и выше. Когда вы находитесь в X, Alt+Functionкомбинация заменяется на Ctrl+Alt+Function; так что если вы в X и хотите переключиться на третий терминал (не завершая X сессию), Ctrl+Alt+F3переключит вас туда. (Alt+F7вернёт вас обратно, если вы используете первую из X сессий.)

5.1.5  Итог

В этом разделе были обсуждены пользователи, оболочка, командная строка и виртуальные терминалы. Вы должны уверенно себя чувствовать при работе в режиме командной строки, выполнении программ и использовании pipe-ов и операторов пере-направления вывода. Так же вы должны усвоить, насколько велик и все-могущественен root пользователь, и почему плохо всегда работать, как root.