Shell - проще выеденного яйца

Материал из Mageia Russian Community Wiki
Версия от 19:39, 4 мая 2023; Sevo44 (обсуждение | вклад) (Новая страница: «=Зачем нам скорлупа= Оболочка Unix'а не просто командный интерпретатор, как командная строка DOS'а в Microsoft Windows (r), но полноценная программная среда. С момента своего появления Unix проигрывал в эффективности многим операционным системам, но имел три решающих...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Зачем нам скорлупа

Оболочка Unix'а не просто командный интерпретатор, как командная строка DOS'а в Microsoft Windows (r), но полноценная программная среда. С момента своего появления Unix проигрывал в эффективности многим операционным системам, но имел три решающих преимущества:

  1. Мог работать на любом железе
  2. Включал превосходивший другие языки на несколько порядков большей ясностью язык Си
  3. Был бесплатен

Говорят, что командная строка устарела, вышла из моды, каменный век, атавизм. Очень даже может быть. Сейчас можно работать в Linux'е, ничего не зная о текстовом режиме. Загружаться прямо в графическую среду KDE, полностью настроить и отладить систему в Центре управления Магией, поработать в LibreOffice, погулять по интернету в Firefox и выключить компьютер, так и не увидев чёрный экран терминала. Однако нам кажется, что работать в Linux'е без командной строки это как гонять на машине не переключаясь выше первой передачи, да и заднюю ни-ни. Конечно, много проще не заморачиваться переключением передач, но удовольствие всё же не то. Согласитесь.

Терминалы

Unix работал на разных машинах. Люди общались с ними через терминалы, состоявшие из клавиатуры и монитора. Точно также выглядели тогда и телетайпы, от которых пошло название заменяющих терминальные устройства файлов "tty".
Вы спросите, к чему это всё? А к тому, что производители тех терминалов не могли договориться о стандартах и каждый выпускал свою клавиатуру с оригинальной раскладкой, свой монитор с оригинальным выводом знаков на экран, оригинальными кодами сигналов управления и так далее. Для обуздания этого хаоса был придуман стандартный файл termcap. Удивитесь вы или нет, но этот файл и сейчас лежит в вашей Магии /etc/termcap. Откройте его в текстовом редакторе и убедитесь, что Магия использует тот же "vt100" или "linux", что и терминалы из далёкого прошлого.
В Магии вы можете открывать сессии, эмулирующие древние терминалы комбинациями клавиш от CTRL+ALT+F2 до CTRL+ALT+F6. ALT-F1 переключит вас назад в графическую сессию. Вместо реальных терминалов существуют их эмуляторы - специальные файлы от /dev/tty2 до /dev/tty6.

Графические терминалы XTerms

В начале 1980-х для Unix была разработана графическая оконная подсистема X Window System. От неё в начале 1990-х произошла XFree86 как более стабильная версия для только что появившихся тогда, ориентированных на процессоры Intel клонов Unix'а - FreeBSD, NetBSD и Linux. Позже от XFree86 произошла x.org - основная на сегодня графическая подсистема Магии.

X использовался для одновременного запуска нескольких виртуальных терминалов. Он поставлялся в виде приложения xterm. Теперь xterm стал синонимом любого виртуального терминала. Если вы прочтёте указание "открыть xterm", не спешите устанавливать программу с таким названием, подойдёт любой эмулятор терминала: rxvt, konsole, aterm, eterm, wterm, и так далее.

Эмулятор терминала (по-другому, виртуальный терминал) подключается к системе через файл псевдо-устройства tty и использует свой стандарт отображения. Это может вызвать незначительную разницу в поведении некоторых клавиш или приложений на разных эмуляторах терминалов, в зависимости от того, насколько точно эти эмуляторы эмулируют стандарт отображения xterm.

Запустить такой эмулятор в KDE-окружении Магии можно так

  1. Меню запуска приложений (Application Launcher Menu) в нижнем левом углу экрана
  2. Утилиты (System Tools)
  3. Консоль или XTerm (Terminals)

Каждой из этих программ соответствует специальный файл pts (Pseudo-Terminals): /dev/pts1, /dev/pts2 и так далее.

Оболочки Shells

Для запуска программ в терминале требуется оболочка - интерфейс между операционной системой и пользователем и между командами. Первая такая оболочка Unix'а, sh, написана в 1975 году Стивом Бурном, поэтому её называют Bourne shell. Вскоре другие программисты на её основе написали свои оболочки, такие как ksh и zsh. Их часто используют в проприетарных Unix'ах. Есть и другие оболочки, использующие свойства языка Си: csh и tcsh.

В Linux'е стандартной оболочкой является bash (the GNU Bourne-Again Shell - это такой Unix'овый юмор). Она настолько мощная, что только одно её архивированное! описание занимает 50 KB.

Первый класс

Не надо постоянно работать в терминале с правами root'а. Особенно, если вы недостаточно опытны. Работая под своим логином, вы никогда не грохните систему, а из под root'а рано или поздно непременно грохните. Ну и кому это надо?

Запустив терминал, вы увидите приглашение командной строки. В Магии оно состоит из вашего логина, имени машины (если оно не задано, по умолчанию используется localhost), текущей рабочей папки (Present Working Directory. Тильда '~' заменяет домашний каталог пользователя) и знака приглашения:

[user@machine tmp]$

Под root'ом приглашение будет выглядеть иначе:

[root@machine tmp]#

Основные команды:

  • ls список содержимого текущей рабочей папки
  • cp копировать
  • mv переименовать
  • cd сменить папку

Если ввести несколько букв и нажать "TAB", будут показаны все команды, начинающиеся с этих букв. У команд бывают параметры (-) и аргументы:

[user@machine ~]$ mv -i file dir

Запоминать их не надо, потому что всегда можно посмотреть в описании

[user@machine ~]$ man mv

или во встроенной в команду справке

[user@machine ~]$ mv --help

Пока всё выглядит как в DOS'е. Дальше будет интересней.

Второй класс

Нажмите комбинацию клавиш Alt+Ctrl+Fn (n = 2...6). Только не надо логиниться под root'ом, введите ва́ш логин и пароль. Вернуться назад - Alt+F1. Если запустить из Меню запуска приложений (Application Launcher Menu) - Утилиты (System Tools) - Консоль (Konsole), то логиниться не придётся.

Где я?

[user@machine ~]$ pwd

pwd = Print Working Directory

Создать пустой файл

[user@machine ~]$ touch file_name

Если file_name существует, то поменяется только его дата и время, а содержимое не изменится.

Добавить строку в конец файла

[user@machine ~]$ echo "ля ля ля" >> file_name

Если вы логинились в новой сессии, то по-русски написать не получится. Пишите латиницей. Переключение раскладки не как обычно, а CapsLock'ом. В Консоли (Konsole) и по-русски можно, и переключение не меняется.

Прочесть файл

[user@machine ~]$ cat file_name

Заменить содержимое файла

[user@machine ~]$ echo "о го го" > file_name

Если файл не существует, то он будет создан. Забудьте команду touch.

Читать длинный файл

[user@machine ~]$ less длинный_файл
j - вниз
k - вверх
q - выход

Искать в файле

[user@machine ~]$ grep строка файл

Узнать обстановку

top список программ по убыванию важности для процессора (сколько помещается на экране). q - выход.
ps aux список активных программ.

История команд

history

Факир на час

su после ввода пароля делает вас администратором с логином root. Будьте осторожны! exit или Ctrl+D возвращает вам прежнее имя.

Третий класс

Unix и его младший брат Linux умеют упрощать работу с командной строкой.

Автодополнение

Как быстрее всего перейти из домашнего каталога в /usr/src/linux/Documentation/isdn/? Вот как:

[user@machine ~]$ cd /u\<TAB\>sr\<TAB\>l\<TAB\>/D\<TAB\>is\<TAB\>

Это называется автоматическое дополнение командной строки. Разберём этот пример:

[user@machine ~]$ cd /u\<TAB\>

дополняет до

[user@computer ~]$ cd /usr/

Дальше:

[user@machine ~]$ cd /u\<TAB\>sr\<TAB\>

дополняет до

[user@machine ~]$ cd /usr/src/

Если вы введёте просто "cd /u\<TAB\>s\<TAB\>", то получится три подкаталога /usr, соответствующих шаблону 'cd /u\*/s\*': /usr/sbin, /usr/share и /usr/src.

Таким образом, клавиша "TAB" оказывается удобным инструментом поиска каталогов и подкаталогов, если вам известны их первые буквы. Например,

[user@machine ~]$ ls /usr/bin/zip\<TAB\>

покажет вам все файлы и подкаталоги в /usr/bin, начинающиеся с 'zip'. Конечно, для решения этой задачи есть более мощные команды, но когда вы спешите, этот трюк незаменим.

Особенно он полезен с очень длинными именами файлов. Скажем, вы хотите установить RPM под названием boomshakalakwhizbang-4.6.4.5-mdk586.rpm. Напечатайте:

[user@machine ~]$ rpm -i boom\<TAB\>

и шаблон дополнится до полного названия сам собой.

[user@machine ~]$ cd /u\<TAB\>sr\<TAB\>l\<TAB\>

дополнится до "cd /usr/src/linux". В каталоге /usr/src есть два подкаталога: /usr/src/linux-... и /usr/src/linux. Как добиться однозначности? Добавьте в конец второго имени слеш '/'.

Предположим, вы не уверены как правильно: /usr/src/linux/Documentation или /usr/src/linux/documentation. Вы конечно помните, что Linux различает строчные от прописных. Если вы читали внимательно, то уже знаете ответ:

[user@machine ~]$ cd /u\<TAB\>sr\<TAB\>l\<TAB\>/d\<TAB\>

дополнится до /usr/src/linux/drivers/. А была бы прописная 'D', получилось бы 'Documentation'.

Дополнение работает и для команд:

[user@machine ~]$ gre<TAB>
grecord  grefer  grep

А так получится список всех команд, начинающихся с 'gre':

[user@machine ~]$ gre

История команд

Нажимая стрелку вверх, вы можете перебрать все предыдущие команды. И наоборот стрелкой вниз. Старую команду можно подправить и запустить снова.

CTRL+r переводит bash в режим поиска по заданной подстроке. Попробуйте написать несколько букв - будет найдена предыдущая команда с такой подстрокой. Теперь, если нажать ESC или стрелку вправо или влево, команду можно подправить и запустить снова.

Редактирование командной строки

В командной строке можно перемещать курсор стрелками и клавишами Home, End и др. Кроме того, редактировать можно некоторыми сочетаниями клавиш:

  • CTRL+k: стирает (kill) от курсора до конца строки
  • CTRL+u: стирает от курсора до начала строки
  • ALT+d: стирает от курсора до конца слова
  • CTRL+w: стирает от курсора до начала слова
  • CTRL+a: передвигает курсор к началу строки
  • CTRL+e: передвигает курсор в конец строки
  • ALT+b: передвигает курсор к началу слова
  • ALT+f: передвигает курсор в конец слова
  • CTRL+y: вставляет последнее удалённое слово
  • !$ : повторяет последний аргумент предыдущей команды

Пример: Вы создали каталог mkdir peter/pan/documents/tinkerbell. Теперь вы хотите перейти в него командой cd.

[user@machine ~]$ cd !$

Это сокращение можно использовать не только в командной строке, но и в приложениях.

Сокращения

В Магии уйма сокращений. Некоторые встроены в bash, некоторые сконфигурированы нами. Так как пользователь в основном работает в своём домашнем каталоге, многие Unix-системы предлагают наборы сокращений специально для этих каталогов. Например, тильда "~" это сокращение полного пути к вашему домашнему каталогу. Более того, сама команда cd без параметров и аргументов перенесёт вас в родной дом. Попробуйте.

Магия предлагает вам использовать следующие сокращения (aliases):

  • cd.. вместо 'cd ..' перейти в верхний каталог
  • s вместо 'cd ..' то же самое
  • d вместо 'ls' список содержимого текущего каталога
  • l то же самое
  • la вместо 'ls -a' полный список, включая скрытые файлы, начинающиеся с точки
  • ll вместо 'ls -l -k' список с атрибутами файлов и их размером в КВ
  • ls вместо 'ls -F ––color=auto' список с цветным индикатором типа файла
  • lsd вместо 'ls -d \*/' список не файлов, а только подкаталогов
  • md вместо 'mkdir' создать каталог
  • p вместо 'cd -' перейти в предыдущий каталог
  • rd вместо 'rmdir' удалить пустой каталог

Четвёртый класс

Очередь команд

Для последовательного выполнения нескольких команд, можно выстроить их в командной строке одну за другой. Команды должны быть чем-то разделены и два таких разделителя особенно важны: ";" и "&&". Пробелы между командами не обязательны и вставляются просто для красоты - никакой разницы между такой "ls -a ; du -hs" и такой "ls -a;du -hs" записью компьютер не ощутит.

[user@machine ~]$ команда1 ; команда2

Сначала выполняется команда1, а потом - команда2, даже если команда1 закончилась с ошибкой. Пример:

[user@machine ~]$ ls -a ; du -hs

Сначала на экран будет выведен список всех каталогов, затем - общий размер файлов в них.

[user@machine ~]$ команда1 && команда2

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

[user@machine ~]$ ls -a Киже && du -hs

В ответ мы получим: "ls: невозможно получить доступ к Киже: Нет такого файла или каталога" и следующая команда "du" даже не запустится.

Совместительство

Запуск команды или программы блокирует терминал на всё время её исполнения. В Unix'е, если в это время нам надо исполнить другую команду, мы можем запустить ещё один терминал для неё.

Но существует более элегантный способ, называемый работой по совместительству (jobbing), то есть в фоновом режиме. Если перевести команду с основной работы на работу по совместительству, она немедленно освободит терминал для новой задачи. Всё, что нужно для этого сделать, это поставить после команды амперсанд "&":

[user@machine ~]$ gimp &

Команда jobs покажет все запущенные на этом терминале в фоновом режиме программы:

[user@machine ~]$ jobs
[1]+  Running                  gimp &

Важно помнить, что, закрыв терминал, мы прекратим выполнение всех работающих в нём программ.

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

[user@machine ~]$ gimp
(нажать CTRL+z)
^Z
[1]+  Stopped                  gimp

Затем

bg gimp
[1]+  gimp &

Комбинация клавиш CTRL+z остановит работающую в терминале программу и вы сможете командой bg переместить её с переднего плана в фоновый.

Иногда бывает полезно запускать графические приложения из командной строки в основном режиме (на переднем плане). Этим достигается вывод сообщений программы на терминал, что может понадобиться для отладки. Некоторые графические программы, особенно в период их бета-тестирования, даже в фоновом режиме посылают сообщения на терминал. Если это раздражает, можете отключить эти сообщения:

[user@machine ~]$ команда &>/dev/null &

Это не только поместит программу в фоновый режим, но и направит все сообщения терминала в файл /dev/null, который как шредер превратит их в ничто.

Подстановка команд

Подстановка команд - очень удобная штука. Скажем, вы хотите взглянуть на файл README.systemd, но не знаете, где его искать.

[user@machine ~]$ locate README.systemd

Теперь вы знаете адрес /var/lib/rpm-helper/systemd-migration/README.systemd и хотите просмотреть файл командой less. Тут-то и пригодится подстановка команды $:

[user@machine ~]$ less $(locate README.systemd)

То есть, всё в один шаг. Результат команды locate README.systemd = /var/lib/rpm-helper/systemd-migration/README.systemd является аргументом команды просмотра файла less.

Синтакс этого механизма таков:

[user@machine ~]$ команда1 $(команда2)

Вместо $() можно использовать обратные кавычки:

[user@machine ~]$ команда1 `команда2`

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

Вот ещё один пример. Допустим, вы хотите прикончить упрямую программу futynuty. Сделать это можно, только узнав ID её процесса с помощью команды pidof. Вместо

[user@machine ~]$ pidof futynuty 
567
[user@machine ~]$ kill 567

можно так:

[user@machine ~]$ kill `pidof futynuty`

Намного короче, правда?

Пятый класс

Шаблоны

Абстрагирование имён файлов позволяет сократить запись аргументов команд. Для этого определены специальные знаки, называемые шаблонами поиска (wildcards).

Например, вы хотите удалить командой rm все файлы в каталоге, кончающиеся на .bak. Воспользуйтесь шаблоном '*':

[user@machine ~]$ rm *.bak

'*' заменяет от нуля и больше знаков.

Bash читает и переводит командную строку до запуска команды на исполнение. Поэтому шаблоны применимы почти в любых строковых аргументах командах, в именах каталогов и файлов, в поисковых запросах и так далее.

Ещё примеры с шаблоном '*'. У вас в каталоге есть файлы 124.bak, 346.bak и 583.bak. Вам надо оставить только 583.bak:

[user@machine ~]$ rm *4*.bak

Bash расширит '*4*.bak' до всех имён файлов, имеющих цифру '4' и кончающихся на .bak.

Заметьте, что rm 4*.bak не сработает, если в каталоге не будет ни одного файла, начинающегося с цифры '4'. Bash расширит этот шаблон до пустой строки и rm возвратит сообщение об ошибке:

rm: невозможно удалить "4*.bak": Нет такого файла или каталога

Теперь вам надо сохранить файл 346.bak и удалить 124.bak и 583.bak. Эта задачка посложнее, потому что удаляемые файлы ничего общего и отличающего их от сохраняемого не имеют. Но к счастью вы можете выделить файл и по отсутствующему признаку:

[user@machine ~]$ rm *[!6].bak

Это читается так: "удалить все файлы оканчивающиеся на .bak за исключением оканчивающихся на 6.bak". Знак отрицания '!' и отрицаемый знак '6' надо заключить в скобки, иначе bash воспримет восклицательный знак как начало подстановки истории. Отрицание одинаково работает со всеми описанными шаблонами.

Можно очень легко "выстрелить себе в ногу" при использовании знака отрицания и шаблона '*'. Угадайте что случится:

[user@machine ~]$ rm *[!6]*.bak

Будут удалены все файлы, даже имеющие в имени '6'. Совмещение '*' со знаком отрицания, до или после него, делает знак отрицания практически бесполезным, потому что условие прочитывается как "все имена, которые не имеют '6' на любом месте". В нашем примере единственным соответствующим файлом будет 666.bak.

Следующий шаблон - вопросительный знак '?'. Он заменяет ровно один символ. Для его демонстрации добавим к трём файлам ещё два 311.bak~ и some.text. Теперь посмотрим список файлов, имеющих после точки ровно четыре знака:

[user@machine ~]$ ls *.????

Этот шаблон позволяет избежать описанной выше "отрицательной ловушки":

[user@machine ~]$ rm *[!4]?.*

Что в переводе на человеческий означает "все файлы, кроме имеющих '4' на второй с конца позиции от точки". Удалятся все файлы, кроме 346.bak.

Есть что-то ещё? Ещё бы! До сих пор вы видели шаблоны, замещающие один знак в одной позиции. Но ничто не мешает нам использовать несколько совпадений:

[user@machine ~]$ ls [13]*

Получится список файлов, начинающихся с цифры '1' или с цифры '3'; в нашем примере это файлы 124.bak, 311.bak~ и 346.bak. Скобки обязательны, иначе с шаблоном совпадут файлы, начинающиеся со строки '13'.

Для полного счастья не хватает определения диапазона совпадения:

[user@machine ~]$ ls *[3-8]?.*

Получится список файлов, в которых предпоследний перед точкой знак - это цифра от '3' до '8'; в нашем примере это файлы 346.bak и 583.bak.

Применение специальных знаков

Этот мощный механизм шаблонов подстановки имеет один недостаток: bash всегда раскрывает шаблон до начала исполнения команды. Вот некоторые типичные случаи:

  • Специальные знаки в имени файла. Предположим, в том же каталоге есть файл !56.bak. Попробует указать его шаблоном:
[user@machine ~]$ rm !*
rm: пропущен операнд

Bash интерпретирует '!*' как подстановку аргументов предыдущей команды, а не как подстановку шаблона.

  • Команды, в аргументах которых применяются специальные знаки. В таких Linux-командах как (e)grep, sed, awk, существуют наборы собственных установок, называемые регулярными выражениями. Эти выражения выглядят точно также как и шаблоны подстановок, но интерпретируются иначе.
    Для того, чтобы заставить команду интерпретировать их в первую очередь надо указать bash'у, что это именно шаблон подстановки:
[user@machine ~]$ find . -name [1-9]* -print
find: paths must precede expression

Правильно:

[user@machine ~]$ find . -name '[1-9]*' -print
./346.bak
./124.bak
./583.bak
./311.bak~

Такие специальные знаки как ! , $, ? или пробел также можно обозначить or the empty space either with a обратным слэшем \:

[user@machine ~]$ ls \!*
!56.bak

или одиночными кавычками

[user@machine ~]$ ls '!'*
!56.bak

Примечание. В новых версиях bash всё описанное может быть изменено. Читайте сопроводительную документацию.

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

Философия Unix состоит в том, чтобы иметь много небольших программ, остро заточенных на решение узкой задачи. Сложные задачи решаются не сложными программами, а несколькими маленькими, связанными друг с другом с помощью механизмов оболочки. Один из таких механизмов - перенаправление вывода программ:

[user@machine ~]$ команда1 | команда2 | командаd3

Чаще всего вывод программ направляют в постраничный просмотр more и less:

[user@machine ~]$ ls -l | less

Более сложный пример:

[user@machine ~]$ rpm -qa | grep ^x | more

Перенаправление в файл или из файла

Иногда необходимо записать вывод программы в файл или ввести в программу данные из файла. Это делается операторами > и <.

[user@machine ~]$ команда > файл

записывает в файл вывод команды, стирая прежнее содержимое файла.

[user@machine ~]$ команда < файл

вводит в команду данные файла.

[user@machine ~]$ sort < dirlist > sdirlist

вводит данные файла dirlist в программу sort, которая сортирует их и сохраняет в файле sdirlist. Более реальна такая последовательность команд:

[user@machine ~]$ ls | sort > sdirlist

команда 2 > файл - записывает в файл сообщения об ошибках.

Оператор >> добавляет данные к содержимому файла:

[user@machine ~]$ команда "строка" >> файл

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

[user@machine ~]$ команда < файл > файл

уничтожит содержимое файла. А такая последовательность

[user@machine ~]$ команда < файл >> файл

добавит к исходным данным файла обработанные данные.

Шестой класс

Файлы конфигурации

Следующая команда покажет список файлов пользовательской конфигурации оболочки в вашем домашнем каталоге

[user@machine ~]$ ls .bash*
  • .bash_history введённые вами команды
  • .bash_logout команды, выполняемые при выходе из оболочки
  • .bash_profile команды, выполняемые при входе в оболочку
  • .bashrc команды, выполняемые при входе в оболочку

Разница двух последних в том, что .bash_profile читается единственный раз в начале сессии, а .bashrc читается каждый раз, как запускается новый терминал (новое окно xterm). Задать такие переменные как PATH можно в файле .bash_profile, а псевдонимы и функции - в файле .bashrc.

Эти файлы предназначены для пользовательских установок. Системные установки хранятся в файлах /etc/profile, /etc/bashrc и в файлах каталога /etc/profile.d. Вносить изменения лучше в файлы пользовательской конфигурации, во-первых потому, что для их редактирования не надо логиниться под root'ом и во вторых потому, что они позволяют задавать разную конфигурацию для каждого пользователя. В случае конфликта системных установок с пользовательскими, последние имеют приоритет.

Приглашение командной строки

За строку приглашения отвечают переменные среды PS1, PS2, PS3, PS4 и PROMPT_COMMAND.

  • PS1 задает вид строки приглашения
  • PS2 второй тип приглашения
  • PS3 выводится с оператором select
  • PS4 выводится при отладке сценариев (скриптов)
  • PROMPT_COMMAND исполняется перед выводом каждой строки приглашения

Значение каждой переменной можно узнать, введя в терминале echo $имя_переменной. Например,

[user@machine ~]$ echo $PS1

Изменить значение переменной можно двумя способами:

1. Указать значение непосредственно в терминале с помощью команды export.
[user@machine ~]$ export PS1="Сессия:\u Машина:\h: Каталог:\w Команда:"
Сессия:user Машина:machine Каталог:~ Команда:export PROMPT_COMMAND="ls;cal -3"
Сессия:user Машина:machine Каталог:~ Команда:export PS1="\[\e[5;40;5;31m\][\A]
\[\e[0;1;34m\]\u@\h:\w\$\[\e[0m\] "

Такие изменения будут действовать только в текущей сессии, в новой всё вернётся назад.

2. Отредактировать файлы пользовательских установок .bash_profile и .bashrc в вашем домашнем каталоге или файл общих установок /etc/bashrc. Эти установки будут действовать в каждой сессии.

Значения специальных символов можно узнать командой man bash в разделе PROMPTING.

Изменение перечня путей поиска

Также как PS1, PATH принадлежит к группе переменных среды, которую можно посмотреть командами set, typeset или env. В процессе запуска в bash ищет следующие файлы:

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

(в указанном порядке) и выполняет содержащиеся в них команды. Если bash запускается повторно из командной строки, то он находит файл ~/.bashrc и выполняет содержащиеся в нем команды. В отличие от других дистрибутивов, в Магии при загрузке bash читается файл ~/.bashrc, а уже из него вызывается общесистемный файл /etc/bashrc.

Изменять значения переменных среды стоит только твёрдо зная, что вы делаете и зачем. Переменная PATH формируется в двух скриптах: /etc/profile (пути, общие для всех пользователей) и в одном из пользовательских скриптов (например, в ~/.bash_profile), где к ранее сформированному перечню пользователь может добавить пути по своему желанию. Только не стоит делать это в файле ~/bashrc, так как последний читается каждый раз при запуске второго, третьего и т. д. экземпляра оболочки. Для добавления пути (например, /home/user/bin) в переменную PATH надо вписать в выбранный файл строку "PATH=$PATH:/home/user/bin". Изменение PATH из командной строки

[user@machine ~]$ PATH=$PATH:/home/user/bin

будет действовать только в одном экземпляре bash. Для всех терминалов одной сессии надо добавить команду export

[user@machine ~]$ export PATH=$PATH:/home/user/bin
[user@machine ~]$ echo $PATH

Обратите внимание на то, что двоеточия в конце нет. И имейте в виду, что каталоги просматриваются в поисках нужного файла в том порядке, как они перечислены в переменной PATH.

В отличие от MS-DOS Linux не ищет исполняемый файл в текущем каталоге. Поэтому, если вы хотите, чтобы поиск производился и в текущем каталоге, надо добавить и этот каталог (он имеет имя, состоящее из одной точки) в переменную PATH. Но имейте в виду, что с точки зрения безопасности добавлять текущий каталог в перечень путей поиска недопустимо, так как злоумышленник может поместить в один из доступных ему по записи каталогов вредоносную программу, названную именем одной из часто используемых системных утилит. И, когда вы запустите эту программу, считая, что запускаете системную утилиту, она может нанести большой вред вашей системе, тем более, если вы запустили ее от имени суперпользователя root.

Седьмой выпускной

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

Псевдонимы команд

Предположим, вы хотите загрузить свои материалы на сайт MUO:

[user@machine ~]$ rsync -e ssh -z -t -r -vv ––progress /home/tom/web/muo/rsmuo/docs muo:/www/mandrakeuser/docs

Если такую команду печатать каждый раз вручную, можно с ума сойти. Лучше создать в каталоге ~/.b/fre/ashrc псевдоним этой команды:

[user@machine ~]$ alias upmuo='rsync -e ssh -z -t -r -vv --progress /home/tom/web/muo/rsmuo/docs muo:/www/mandrakeuser/docs'

Теперь достаточно ввести upmuo. Короче, не правда ли?

Если команда содержит пробелы, надо заключить её в кавычки. Одиночные кавычки отменяют специальное значение всех символов, двойные - всех, кроме $ (подстановка параметра) и ` (подстановка команды). В последнем примере можно было бы использовать переменную MUOHOME из файла .bashrc:

[user@machine ~]$ export MUOHOME=$HOME/web/muo/rsmuo/docs

Тут уже необходимы двойные кавычки

[user@machine ~]$ alias upmuo="rsync -e ssh -z -t -r -vv ––progress $MUOHOME muo:/www/mandrakeuser/docs"

потому, что иначе псевдоним будет искать каталог или файл под названием $MUOHOME.

Псевдонимы можно создавать "на лету" в командной строке командой alias, или записать их в файл ~/.bashrc (для одного пользователя), или в файл /etc/profile.d/alias.sh (для всех пользователей и суперпользователя root). В предшественниках Магии эту функцию выполнял файл /etc/bashrc.

Удалить псевдоним можно командой unalias alias. Команда alias без параметров покажет все псевдонимы в системе.

Псевдоним имеет приоритет перед командой с таким же именем. Вот некоторые полезные псевдонимы:

  • alias rpmq='rpm -qa | grep': Команда rpmq строка выведет список установленных пакетов, содержащих в своём названии заданную строку.
  • alias ls='ls -ho ––color | more': ls теперь будет постранично показывать расцвеченный список файлов с указанием их размера в KB.
  • alias use='du ––max-depth=1 | sort -n | more': use покажет постранично список подкаталогов, отсортированный по их размеру.
  • alias dkd='cd /usr/src/linux/Documentation': Псевдоним часто используемого каталога.

Функции оболочки

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

[user@machine ~]$ function apros() { apropos $1 | egrep -v '(3|\(n\)'; }

Определение новой команды apros. Она ищет в учебнике man страницы по заданной аргументом $1 теме и направляет (|) вывод в egrep, который отфильтровывает малоинтересные страницы разделов '3' и 'n'.

Если в новой команде задействовать два аргумента

[user@machine ~]$ function apros() { apropos $1 | egrep -v "\($2"; }

то можно не только задать нужную тему учебника, но и исключить ненужную главу:

[user@machine ~]$ apros тема номер_главы

Так

[user@machine ~]$ apros menu 3

покажет все страницы учебника со словом 'menu', кроме третьей главы, посвящённой программированию.

Функции оболочки работают точно так же, как псевдонимы. Удобнее всего поместить их в файл .bashrc.

Часто задаваемые вопросы

Как выключить эту чёртову бибикалку?!
[user@mashine ~]$ setterm -blength 0
Что значит "bash: <команда>: команда не найдена"?

Если не было опечатки, то вероятнее всего, команда, которую вы пытаетесь выполнить, находится в каталоге, не включённом в переменную среды PATH. Вам надо узнать и напечатать полный путь к этой команде.

Что значит "bash: <команда>: отказано в доступе"?

Для запуска исполняемого файла у пользователя должно быть соответствующее право доступа. Изменить права доступа файла можно командой:

[user@machine ~]$ chmod 755 файл

Если это не сработает, прочтите в учебнике man главу Permissions.

У меня есть право запуска файла, но в запуске мне отказано. Почему?

Проверьте в таблице файловой системы /etc/fstab параметры дискового раздела, где находится этот файл. Убедитесь, что он не помечен как неисполняемый 'noexec'. Помимо параметра 'user', должен быть включён параметр 'exec'.

Как поменять цвета в просматриваемом файле?

Скопируйте '/etc/DIR_COLORS' в ваш домашний каталог, переименовав его в '.dir_colors'. Всё, что вам нужно, находится в этом файле.

Мой скрипт 'foo' лежит в каталоге ~/bin, но когда я его запускаю, выполняется другая программа. Почему?

Посмотрите переменную PATH и вы увидите, что ваш домашний каталог ~/bin находится в конце строки. А bash ищет заданное вами имя файла с начала строки и находит первым другую команду с таким же именем. Переименуйте ваш скрипт.

Что значит "bash: <команда>: bad interpreter"?

Чаще всего такое сообщение появляется при установке бинарных или Java-приложений сторонних разработчиков. Эти приложения рассчитаны на работу не в нашей, а в собственной оболочке. Поэтому вместо

[user@machine ~]$ команда

надо

[user@machine ~]$ sh команда
Терминал повисает каждый раз, как я нажимаю CTRL+s

Ну так не нажимайте! ;-) CTRL+s посылает на терминал команду запрета прокрутки (scroll lock). Для снятия запрета нажмите CTRL+q.