LXF78:Мощные инструменты командной строки
Seafox (обсуждение | вклад) (Новая: ''Срубите GUI, вышвырните мышь из дома и дайте вашей графической супер-карте отдохнуть – «реальные паца...) |
Версия 14:09, 22 марта 2008
|
|
|
Срубите GUI, вышвырните мышь из дома и дайте вашей графической супер-карте отдохнуть – «реальные пацаны» используют командную строку, утверждает Пол Хадсон.
Содержание |
Это четвёртый из наших уроков серии Hardcore Linux, и если вы досюда добрались, то вам почти пора наниматься в Linux Format. Заметьте, только почти, потому что ваши испытания на самом деле только начинаются. Вот как побываете под брюхом овцы, ослепите циклопа горящим бревном, перехитрите Цирцею и напишете собственный драйвер, тогда и будете готовы присоединиться к суперэлитной команде LXF.
А пока – сидите на коленях мастеров и учитесь, и в этом месяце вам откроются тайны командной строки. Причина, по которой храбрецы вроде нас овладевают командной строкой, та же самая, из-за которой Эдмунд Хиллари [новозеландец, впервые покоривший Эверест, в паре с проводником-шерпом Тенсингом Норгеем, – прим. перев.], по его словам, совершил восхождение на Эверест. Нет, не ради свежего горного воздуха, а просто потому, что Эверест есть.
Я хотел бы стать вашим Тенсингом Норгеем и помочь вам в восхождении к знаниям. Но, к сожалению, возможность слияния разумов исключается, ибо профанам Башни LXF недоступны, а Древнейшее Таинство Приобщения осложнено тем, что Mountain Dew в ближайшем универсаме на всех не хватит. Придется обойтись прозаическими бумагой и чернилами.
Шаг 1 – Секреты Bash
Стивен Борн (Stephen Bourne) написал первоначальный вариант командной оболочки Bourne для 7-й версии Unix в далёких семидесятых, и увидел Бог, что это хорошо. Но в 1987 году ее заменили улучшенной версией, названной Bourne-again Shell и большинству известной как Bash. Этот терминал уже много лет используется по умолчанию чуть ли не в каждом дистрибутиве Linux, так что новички даже не догадываются, что бывают и другие оболочки. Команда ls -l /bin/sh докажет вам, что самая основная оболочка на вашей системе – на самом деле просто ссылка на Bash, поскольку Bash – расширение sh, добавляющее новые функции, не нарушая работоспособность скриптов.
Bash еще функциональнее, чем можно вообразить. Всем нам доводилось пользоваться встроенными командами типа cd и export, а как насчёт time, alias, for и волшебного обратного апострофа? Даже управление заданиями, считавшееся абсолютно необходимым во времена больших компьютеров, – это вымирающее искусство. Ладно, я несколько отклонился от темы, дальше отклоняться не буду: настало время воскресить старые методы и поведать молодёжи, почему псевдонимы столь важны, сохраняя традиции наших Unix-предков. И первый шаг в этой революции – освоить Bash.
- Меняем псевдонимы
Используемый по умолчанию набор команд в Unix довольно ограничен, но его можно обогатить с помощью различных параметров, передаваемых командам для модификации их работы. Кому нравится набирать команды, загибающиеся на три строки, поднимите руку! Конечно, это подвох – немногие люди, которые и вправду любят подобные вещи, вероятно, из-за артроза кистей рук поднять их не смогут.
Псевдонимы (aliases) – это простой способ создавать укороченные команды в Linux. Например, можно определить псевдоним la, который запускал бы ls -a. На самом деле многие дистрибутивы поставляются именно с таким псевдонимом, установленным по умолчанию – если вы введёте alias в командной строке, то увидите список всех готовых псевдонимов. Чтобы создать собственный, введите
alias la=’ls -a’
По идее, нужно вводить этот (и другие ваши псевдонимы) каждый раз после перезагрузки, но чтобы не увеличивать ваши ежедневные заботы, Bash позволит вам раз навсегда занести ваши псевдонимы в файл ~/.Bash_aliases, да сам их и загрузит.
- Условный ответ
Bash – мощная система разработки скриптов, способная проверять условия в операторах if и циклах не хуже других языков программирования. Скриптов я касаться не буду, но условные операторы могут очень пригодиться при использовании в псевдонимах.
Вот общий пример условного оператора:
if uname -a | grep «GNU/Linux» > /dev/null; then echo «Вы работаете в Linux»; fi
Работает он следующим образом: сперва исполняет uname -a, для получения информации о системе, а затем просеивает эту информацию через grep, пытаясь обнаружить строку «GNU/Linux». Заметьте, что вывод команды перенаправлен в /dev/null, чтобы результат grep не выводился на экран. Если grep найдёт строку, значит, наше условие истинно (true), и Bash выведет: «Вы работаете в Linux». Обратите внимание на использование точки с запятой: после условия и действия, но не после fi (if наоборот; по сути, то же, что и endif).
Мы можем усложнить оператор, добавив блок else – действие, которое будет выполнено, если условие вернёт значение «ложь» (false).
- Расширим предыдущий пример:
if uname -a | grep «GNU/Hurd» > /dev/null; then echo «Вы работаете в Hurd»; else echo «Вы работаете не в Hurd»; fi
Само условие может быть любой сложности. Попробуем, например, проверить, запущен ли Firefox, выполнив ps aux и перенаправив вывод на grep для поиска процесса firefox.
Однако, grep сам является программой, а значит, появится в выводе ps. И поскольку строка «firefox» содержится в «grep firefox», то окажется, что Firefox якобы запущен, хотя на самом деле мы всего лишь запустили поиск такой строки. Чтобы обойти эту проблему, применим grep дважды: сперва для проверки наличия Firefox, а затем, с ключом -v, для инвертирования условия, чтобы исключить из результата строку с grep. Итак:
if ps aux | grep firefox | grep -v grep > /dev/null; then echo «Firefox запущен»; fi
Совершенно неудобоваримо, так что заготовим псевдоним...
alias isff=’if ps aux | grep firefox | grep -v grep > /dev/null; then echo «Firefox запущен»; fi’
Теперь, чтобы узнать, запущен ли ваш любимый браузер, достаточно выполнить команду isff.
- Зацикливаем циклы
Условные операторы превосходны для основных задач, но истинная мощь Bash заключается в циклах – в них оператор неоднократно повторяется, обрабатывая новые данные. Иногда это просто выполнение команды несколько раз, например:
while (true); do sleep 1; date; done
Эта команда ежесекундно выводит на экран дату и время, пока не нажмут Ctrl+C. Но вам, скорее всего, захочется пройтись циклом по строкам файла или файлам в каталоге и что-нибудь с ними сделать.
Как, например, распаковать несколько файлов tar.bz2 одной командой? Новички вообразят, что можно скомандовать
tar xjf *.tar.bz2
Но при попытке это сделать возникает сообщение об ошибке: «tar: foo.tar.bz2: Not found in archive (не найден в архиве)». Дело в том, что Bash разворачивает регулярное выражение *.tar.bz2 в список файлов каталога, фактически превращая введённую команду в такую:
tar xjf bar.tar.bz2 baz.tar.bz2 foo.tar.bz2
Когда вы передаёте утилите tar несколько файлов, первый из них рассматривается как имя архива, и tar попытается извлечь оттуда перечисленные далее файлы. Приведённая выше команда читается так:
«извлечь baz.tar.bz2 и foo.tar.bz2 из bar.tar.bz2».
Значительно лучшее решение – использовать циклы: воспользуй тесь командой ls, чтобы получить список bz2-файлов в каталоге, и пройдитесь по ним в цикле, распаковывая каждый по отдельности. Итак:
for i in `ls *.tar.bz2`; do tar xjf «$i»; done
Здесь используется оператор «`» (обратный апостроф, который обычно расположен на клавиатуре слева от цифры 1), он выполняет ls *.tar.bz2 и вставляет её результат в команду на соответствующее место. Вы можете заставить Bash читать данные из файла, используя cat, например, так:
ls *.tar.bz2 > bzip_files for i in `cat bzip_files`; do tar xjf «$i»; done