Журнал LinuxFormat - перейти на главную

LXF145:Shell

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Майк Сондерс ведёт тренинги Linux

Часть 5: Основательно покопавшись в «железе», файловой системе и пакетах, пора полностью освоить командную строку.
Наш эксперт

Майк Сондерс пишет о Linux более десяти лет, и установил больше дистрибутивов, чем съел горячих обедов.

Отдельные скептики готовы заставить вас поверить, что командная строка – замшелый пережиток семидесятых, бессмысленное развлечение умников, которое обычным людям не стоит и трогать. Но когда дело доходит до системного администрирования, большей ошибки нельзя и придумать. Командная строка, она же – оболочка, важна здесь как никогда – и по веским причинам:

  • Она всегда с вами. Она существует за всеми слоями графики, видимыми в типичном настольном дистрибутиве Linux, и даже если оконный менеджер работает некорректно, можно нажать Ctrl+Alt+F2, переключиться в командную строку и исправить неполадки.
  • Ей не нужна графика. На компьютер можно зайти удаленно (по SSH) с другого конца света по коммутируемому соединению и работать так же, как на локальной машине. Не нужны тормозные VNC или удаленный рабочий стол. Аналогично, на многих компьютерах, например, на серверах, графический интерфейс ни к чему. Достаточно командной строки.
  • Она пряма и непосредственна. Она делает именно то, что ей велено. Никакой ерундистики вроде «кликните по красной кнопке недалеко от левого верхнего угла окна, затем найдите меню Foo и поставьте галочку рядом с ним». Вы просто набираете именно то, что должен выполнить компьютер, и он выполняет это. Никаких хождений вокруг да около.

Поэтому все хорошие администраторы обладают глубоким пониманием командной строки, и если вам нужен сертификат LPI, вы должны усвоить идеи и утилиты, о которых мы поговорим. Если вы новичок в Linux, это еще и прекрасный способ понять, насколько мощный и гибкий инструмент командная строка. В предыдущих статьях мы применяли несколько отдельных команд, а теперь изучим Bash – оболочку по умолчанию в 99,9 % дистрибутивов Linux – более глубоко; итак, начнем!

Man, помоги!

Хотите узнать больше о параметрах данной команды или программы? У большинства команд есть документация в виде man-страниц (от manual – руководство). Это не дружелюбные руководства к программам, но в них можно быстро найти значение того или иного параметра. Чтобы открыть страницу man для команды, наберите man и название команды; например, man ls. Содержимое окна просмотра можно прокручивать клавишами управления курсором; для выхода жмите Q. Для поиска определенного слова нажмите клавишу «обратный слэш» (/) и затем введите то, что ищете – например, для поиска слова «size» на man-странице введите /size.

Раздел 1: Ориентируемся

Если у вас графический рабочий стол Linux, командную строку можно открыть с помощью меню – она обычно называется Terminal [терминал], Shell [оболочка], XTerm или Konsole [консоль]. В данном случае мы работаем в CentOS 5.5, где для вызова командной строки используется пункт меню Applications > Accessories > Terminal (Приложения > Стандартные > Терминал). После ее запуска мы увидим вот что:

[mike@localhost ~]$

Это строка приглашения, и она состоит из четырех частей. Первая – имя пользователя, который в данный момент находится в системе; здесь это mike. За ним следует имя хоста нашего компьютера – localhost. Тильда (~) показывает, в каком каталоге мы находимся; например, вместо нее могло бы быть bin, если бы мы находились в каталоге /usr/bin. Обычно сеанс терминала начинается в домашнем каталоге пользователя, и тильда – короткий способ указать на /home/mike, поэтому она здесь.

Наконец, символ доллара –приглашение для ввода. Оно значит, что мы вошли в систему как обычный пользователь; если ввести su для перехода в учетную запись суперпользователя (root), а затем пароль, символ доллара сменится на решетку (#). Попробуем ввести команду – часто это всего одно слово, например:

uname

Команда выводит название операционной системы – «Linux». Однако в закромах uname есть и другие возможности, и для доступа к ним служат флаги (они же – параметры, или ключи).

Флаги обычно указываются с помощью дефиса и букв или слов. Например, попробуйте выполнить команду:

uname -a

Она запустит программу uname, но передаст ей флаг -a, который означает «показать всю информацию» – и вы получите гораздо более подробный вывод. Список доступных ключей для большинства команд можно просмотреть с помощью флага --help, например, uname --help.

$ПУТЬ к свободе

В истинных традициях Linux у этой врезки есть зависимость: основной текст статьи. Пожалуйста, сначала прочтите его, чтобы понять, что такое переменные окружения! Существует специальная переменная $PATH, содержащая список каталогов, из которых можно запускать программы. Введите echo $PATH, и увидите список этих каталогов, разделенных двоеточиями. Например, здесь есть такие каталоги как /usr/bin, /usr/sbin и т. д. (описание назначения каталогов файловой системы см. в LXF143). При вводе команды, например, nano для запуска текстового редактора Nano, оболочка ищет его в этих каталогах.

Однако важно заметить, что текущий каталог не является частью $PATH. Так сделано ради безопасности, чтобы трояны (например, зараженный исполняемый файл ls), проникшие в ваш домашний каталог, не запускались при каждом вызове ls. Если нужно запустить что-то из текущего каталога, допишите в начале команды точку и прямой слэш, например, . /myprog. Оно, может, и нудно, но за долгие годы эта мера доказала свою важность как аспект системной безопасности Linux и Unix. Пусть вы установили что-то в /opt, и теперь для правильной работы путь к данному каталогу надо добавить в переменную $PATH. Тогда воспользуйтесь командой export, как описано в тексте статьи, но не сотрите текущее содержимое $PATH – для этого вызов должен быть таким:

export PATH=$PATH: /opt/newprog

Теперь, вызвав echo $PATH, вы увидите предыдущий список каталогов с добавленным в конец /opt/newprog.

Итак, теперь вы знаете, что искать в строке приглашения, как ввести команду и как изменить ее поведение. Это все основы – теперь перейдем к управлению файлами.

Сперва введите команду ls – вывести список файлов. Она показывает файлы и каталоги в текущем каталоге и в зависимости от дистрибутива может выделять цветом различные элементы списка: например, подкаталоги могут быть окрашены голубым.

Команда ls без параметров не отображает скрытых элементов – это файлы и каталоги, чьи имена начинаются с точки. Чтобы увидеть все файлы, наберите ls -a. (Скрытые файлы – обычно файлы настройки, они не отображаются, чтобы не путать их с обычными файлами.) Для более подробного вывода скомандуйте ls -l. Учтите, что флаги можно комбинировать – например, так: ls -l -a, или еще короче: ls -la. Эта команда выводит более подробную информацию о файлах и каталогах, включая владельца, размер, дату изменения и пр.

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

mkdir newdir

Мы можем войти в него по команде cd (change directory – сменить каталог):

cd newdir

Если теперь ввести ls, вы увидите, что внутри каталога ничего нет. Для возврата в предыдущий каталог введите cd .. (cd, пробел, точка, точка).

Скорая помощь

Хотите запустить команду и закрыть сессию оболочки (например, окно терминала), когда команда закончит работу? Воспользуйтесь командой exec – например, exec nano. После выхода из текстового редактора Nano окно закроется.

Если в прежние времена вы пользовались DOS, вам покажутся знакомыми эти две точки – они всегда являются ссылкой на родительский каталог. Однако в отличие от DOS в команде должен быть пробел. Стоит также отметить, что в отличие от DOS все команды и имена файлов чувствительны к регистру.

Команду cd можно вызывать в текущем каталоге с каталогами в качестве параметров, но можно указывать и полные пути. Например, можно перейти в каталог /usr/bin командой

cd /usr/bin

У команды cd есть еще одна удобная возможность: введя cd без параметров, вы перейдете в домашний каталог. Это экономит время – если у вас особо развесистый логин, вам не придется набирать что-то длинное вроде cd /home/bobthebob1234.

Чтобы вывести полный путь до каталога, в котором вы находитесь, введите команду pwd (сокращение от «print working directory – вывести рабочий каталог»). Если вы только что сменили каталог, например, с /usr/bin на /etc, введите команду cd — (cd, пробел, дефис), чтобы вернуться в каталог, где вы только что были.

Создание и распаковка архивов

Программы, заплаты к ним и другие наборы файлов часто поставляются в виде сжатых файлов во множестве форматов. К счастью, в большинстве дистрибутивов есть необходимые утилиты для распаковки и повторного сжатия файлов, но, к сожалению, флаги у них разные. Так сложилось исторически, и поначалу это немного раздражает, но со временем вы их запомните. Вот небольшая справка:

  • .gz Одиночный сжатый файл. Распаковывается командой gunzip foo.gz. Для сжатия файла воспользуйтесь командой gzip foo.
  • .bz2 Похож на предыдущий, но с более компактным (и более медленным) сжатием. Распаковывается командой bunzip2. Для сжатия файла скомандуйте bzip2. Этот формат с трудом работает на старых компьютерах, но на современных машинах, для распространения больших архивов с исходным кодом вроде ядра Linux, это предпочтительный вариант.
  • .tar Архив на ленте. Лентой сейчас мало кто пользуется, но эта схема позволяет объединить несколько файлов в один (без сжатия). Распаковывается командой tar xfv foo.tar. Команда tar cfv foo.tar file1 file2 dir3 создает новый архив foo.tar с файлами и/или каталогами внутри.
  • .tar.gz/.tar.bz2 Сочетание предыдущих форматов и самый популярный формат распространения исходного кода. Файлы объединяются в один командой tar, затем файл сжимается командой gzip или bzip2. Для распаковки: tar xfv filename.tar.gz или tar xfv filename.tar.bz2. Для создания архива: tar cfvz foo.tar.gz file1 file2 (для .tar.gz) или tar cfvj foo.tar.bz2 file1 file2 (для .tar.bz2).
  • .cpio Относительно редкий формат, объединяющий несколько файлов в один (без сжатия). Распаковывается командой cpio -id <filename. Объединяет файлы команда ls file1 file2


Раздел 2: Ныряем глубже

Имена файлов и каталогов бывают длинными, особенно когда объединяются в пути, но в Bash есть хитроумное средство: дополнение по клавише Tab. Наберите несколько первых букв имени файла или каталога, нажмите Tab, и Bash попытается завершить его. Например, наберите cd /usr/lo и нажмите Tab – и путь должен дополниться до /usr/local. Если в /usr есть два или более каталогов, начинающихся с lo, Bash покажет все возможные варианты.

Дополнение по Tab экономит массу времени в Linux, как и история команд. С помощью стрелок вверх и вниз можно перемещаться по списку предыдущих команд (они хранятся в .bash_history в вашем домашнем каталоге). С помощью стрелок вправо и влево можно передвигаться по команде и редактировать ее. Введя history, вы увидите список последних введенных команд.

Теперь рассмотрим несколько команд для манипуляций с файлами. Чтобы скопировать файл, воспользуйтесь cp:

cp file1.txt file2.txt

Можно скопировать несколько файлов в каталог командой cp file1 file2 file3 dir. Команда перемещения файлов работает похожим образом, и с ее помощью можно переименовать файлы: mv oldname newname. Чтобы удалить файл, воспользуйтесь командой rm filename. Но – предупреждаем: rm не заходит в каталоги и не удаляет то, что внутри, включая подкаталоги. Для этого укажите ключ «рекурсивно»:

rm -r directory

Эта команда удаляет каталог и все файлы и подкаталоги внутри него – ну очень мощная и разрушительная команда! (Ее альтернатива – команда rmdir.) Если вам попадется файл, который вы не можете идентифицировать – например, его имя не слишком наглядно или у него нет осмысленного расширения – воспользуйтесь командой file, которая всегда под рукой:

file /usr/bin/emacs
Скорая помощь

Если вы ввели команду, которая, кажется, закончит работу через несколько часов, и хотите остановить ее, нажмите Ctrl+C. Помните, что эта комбинация клавиш прерывает выполнение команды незамедлительно, поэтому есть вероятность, что она не очистит файлы, с которыми работала!

Эта отличная утилитка берет несколько первых байтов файла и пытается определить его тип (если это возможно). Например, обнаружив заголовок JPEG, она скажет вам, что это файл JPEG. Система, которую использует file, называется «волшебной» и представляет собой базу данных байтов, определяющих тип файлов. Конечно, она работает корректно не во всех случаях, и может оказаться, что простой текстовый файл определится как «База данных Microsoft FoxPro» или другая жуть, если внутри него случайно окажется определенная последовательность байтов.

Иногда бывает нужно изменить время создания файла или создать пустой файл, и здесь в дело вступает команда touch. Опять же, часто нужно определить местоположение файлов командной строкой, и есть два способа это сделать: locate и find. Они работают примерно одинаково, но есть одно фундаментальное различие: команда locate foobar.txt свяжется с заранее созданной базой данных и быстро скажет вам, где находится файл. Эта база данных обычно обновляется раз в день по расписанию программой Cron, поэтому информация в ней может быть неактуальной.

Для более точных результатов воспользуйтесь командой find, например, так:

find /home/mike -name hamster
Скорая помощь

Случайно заполнили терминал непонятными символами? Для очистки экрана введите команду clear (или нажмите Ctrl+L). Если она не работает и странные символы продолжают появляться из-за того, что на терминал вываливаются случайные двоичные данные, попробуйте reset.

Она выполнит доскональный поиск в каталоге /home/mike (и его подкаталогах) в поисках всех файлов и каталогов, содержащих «hamster» в своем имени. Но что если вы намереваетесь произвести поиск в текущем каталоге? Вряд ли вам захочется набирать его полный путь. Выход есть: помните, ранее мы упоминали, что .. (две точки) – родительский каталог по отношению к текущему. А вот . (одна точка) – это текущий каталог. Поэтому предыдущую команду можно переписать так, учитывая, что вы уже находитесь в каталоге /home/mike:

find . -name hamster

В команде find также можно оговорить размер файла: find . –size +100k ищет все файлы размером больше 100 килобайт в текущем каталоге (используйте M для МБ и G для ГБ). Другая альтернатива – поиск по типу: find . -type f найдет только файлы, а -type d – только каталоги. Опции -name, -size и -type можно объединять для конкретизации условий поиска.

В Bash есть исчерпывающие возможности для указания маски нескольких файлов без необходимости перечислять их имена. Звездочка (*), например, означает «любая комбинация букв, цифр и других символов». Попробуйте выполнить команду

ls *.jpg

Она выведет список всех файлов с расширением .jpg, будь это bunnyrabbit.jpg, 4357634.jpg или что-то еще. Ею удобно пользоваться для перемещения и удаления файлов: если у вас есть каталог с изображениями и вы хотите избавиться от тех, что с расширением .bmp, можно выполнить команду rm *.bmp. Если нужна маска только для одного символа, воспользуйтесь знаком вопроса:

mv picture?.jpg mypics

Эта команда переместит picture1.jpg, pictureA.jpg и т.д. в каталог mypics.

Раздел 3: Разберемся в окружении

Проверь себя!

Думаете, что усвоили темы и команды, которые мы сегодня обсудили? Хотите понять, готовы ли вы пользоваться ими на экзамене LPI или в реальной жизни? Посмотрите, сможете ли ответить на эти вопросы, и переверните журнал, чтобы прочесть ответы на них, внизу:

  1. Что означает тильда (~) в строке приглашения?
  2. Как вывести подробный список всех файлов в текущем каталоге?
  3. Какая команда поиска файлов использует предварительно созданную базу данных?
  4. Как установить значение переменной окружения $WM в icewm?
  5. Как добавить /opt/kde/bin к вашему $PATH?
  6. Как создать архив .tar.bz2 из каталога myfiles?
  7. Вы хотите запустить версию Nano из текущего каталога, а не из каталога, указанного в $PATH. Как это сделать?

ответы

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

echo $BASH_VERSION

Здесь echo – команда, которая просто выводит текст, в данном случае значение переменной $BASH_VERSION, на экран. Вы увидите число вроде 3.2.25. Программы могут проверять значение переменной в собственных целях – например, чтобы узнать, запущена ли версия 3.0 или новее и, следовательно, есть ли в ней определенные функции. Чтобы увидеть полный список используемых переменных окружения с их значениями, введите env.

Можно создать и свою переменную среды:

export FOO=“bar”
echo $FOO

(Обратите внимание, что в первой команде нет знака доллара.) Новая переменная $FOO будет существовать, пока открыт сеанс терминала; когда вы закроете его, набрав exit или нажав Ctrl+D, переменная исчезнет. Чтобы сохранить переменную, добавьте ее в файл .bashrc в вашем домашнем каталоге. В этом файле содержатся определения переменных и другие настройки, которые считываются в начале нового сеанса. Сохраните изменения, перезапустите терминал, и они войдут в силу.

В Bash, кроме переменных окружения, в котором выполняются программы, есть и другие переменные – его собственные. Введите команду set, и вы увидите их полный список. Удалить переменную, будь то переменная Bash или переменная окружения, можно следующимобразом:

unset FOO

Эти возможности, в сочетании с дополнением по Tab, символами маски и историей команд, делают командную строку Linux необычайно эффективной, особенно по сравнению с неуклюжей командной строкой DOS из далекого прошлого. Чем ближе вы будете знакомится с командной строкой, тем больше будет соблазн покинуть файловый менеджер.

Главное, ситуация всегда у вас под контролем. При работе в командной строке нельзя случайно выбрать неверную опцию (не считая опечаток): вы делаете именно то, что хотите. Впрочем, это только часть истории – в следующий раз мы научимся перенаправлять вывод с одного терминала на другой или в файл для последующего просмотра. Не пропустите!

Персональные инструменты
купить
подписаться
Яндекс.Метрика