Добавить в избранное | Сделать стартовой страницей

Большая Linux библиотека для пользователей OS Linux и ПО для нее
Есть что сказать? Нужен совет? Посети наш форум.


При поддержке
Продвижение сайта
Продвижение сайта
Раскрутка сайта
Создание сайта
Оптимизация сайта
Интернет реклама
Аудит сайта
Администрирование сервера
настройка сервера
установка сервера
аренда сервера
Администрирование сервера
администрирование сервера
настройка сервера
аренда сервера
Rambler's Top100


Более продуктивная работа с bash 2.x

Автор : DH и Arlantine , [email protected], [email protected]
Перевод : Яна Макдональда (Ian Macdonald)
 

Обзор и введение

bash – это shell, т.е. командный интерпретатор для современных компьютеров. Он совместим с Bourne-shell (sh) и включает полезные функции Korn-shell (ksh) и C-shell (csh). Он соответствует стандартам IEEE POSIX P1003.2/ISO 9945.2 для командных интерпретаторов и утилит.

Некоторые возможности bash, приведенные без строго определенного порядка: редактирование и автозаполнение; история и повторный ввод команд; контроль заданий; функции shell и псевдонимы; массивы; математические операции; кавычки ANSI C; раскрытие "~"; раскрытие "{}"; работа с подстроками; раскрытие косвенных переменных; расширенные возможности ввода-вывода; контроль встроенных команд; помощь; стек для хранения каталогов; режим совместимости с POSIX; интернационализация; определение времени выполнения команды.

bash – командный интерпретатор по умолчанию во всех популярных дистрибутивах Linux. По этой причине, он широко используется, но редко в полной мере.

bash, возможно, самая используемая вами в работе программа Linux, но много ли в действительности вы получаете от ее использования? Если вы хотите повысить производительность, снизив количество нажатий клавиш в день, этот документ для вас.

Переменные shell

$CDPATH
Это малоизвестная и часто недооцениваемая переменная shell. CDPATH выполняет те же действия для встроенной команды cd, что и PATH для исполняемых файлов. Мудро установив ее значение, вы можете сократить количество нажатий клавиш в день.

Попробуйте это:
$ export CDPATH=.:~:~/docs:/mnt:/usr/src/redhat/RPMS:/usr/src:/usr/lib:/usr/local:

После использования вышеуказанной команды, cd i386 вероятно переместит вас в /usr/src/redhat/RPMS/i386 в Linux-системе на основе Red Hat.

$HISTIGNORE
Установите значение этой переменной во избежание попадания в историю команд подряд идущих одинаковых команд и другой не слишком полезной информации. Это сократит бесконечные нажатия клавиши «стрелка вверх» для получения команды, которая находится до команды, введенной вами 20 раз. Это также позволит избежать заполнения большей части истории команд ненужными записями.

Попробуйте это:
$ export HISTIGNORE="&:ls:ls *:mutt:[bf]g:exit"

После использования вышеуказанной команды, повторяющиеся команды, вызовы ls, запуски почтового клиента mutt без каких-либо дополнительных параметров, плюс вызовы встроенных команд bg, fg и exit не попадут в историю команд.

$MAILPATH
bash сообщит вам о новой почте в любом каталоге, указанном в переменной MAILPATH. Это очень полезно если вы пользуйтесь утилитами типа procmail для сортировки вашей почты по каталогам.

Попробуйте добавить следующие команды к вашему ~/.bash_profile, чтобы получать уведомления о появлении новой почты в любом ящике в ~/Mail.

 MAILPATH=/var/spool/mail/$USER
 for i in `echo ~/Mail/[^.]*`
 do
 MAILPATH=$MAILPATH:$i
 done
 export MAILPATH
 unset i
 

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

В это случае, попробуйте что-нибудь похожее на нижеследующее в своем ~/.bash_profile:
export `perl -ne 's/^mailboxes /MAILPATH=/ && tr/ /:/ && print && exit' < ~/.muttrc`

$TMOUT
Если вы установите эту переменную в значение больше нуля, bash завершит свою работу по истечении указанного количества секунд, если в течении этого времени не будет ничего введено.

Эти установки полезны при работе под root для уменьшения риска безопасности в тех случаях, когда кто-то забывает выйти из системы, работая как суперпользователь.

Опции set
  ignoreeof
Обычно, нажатие Ctrl-D в командной строке выкинет вас из командного интерпретатора. Это может раздражать, если вам регулярно необходимо набирать Ctrl-D в других ситуациях, например для завершения Telnet-сессии. В такой ситуации слишком частое нажатие Ctrl-D закроет ваш shell, что может очень вас расстроить. Это опция делает невозможным использование Ctrl-D для выхода из shell.

Опции shopt
Вы можете установить все нижеуказанные опции, введя shopt -s <опция>.
  cdspell
Данная опция исправляет незначительные синтаксические ошибки в вызове команды cd, в этом случае переставленные местами символы, пропущенные и лишние символы будут исправлены без перепечатывания.
  cmdhist Использование данной опции - дело вкуса. Указание данной опции заставит bash записывать многострочные команды в историю как однострочные. Это сделано для упрощения редактирования команд.
  dotglob
Эта опция позволяет файлам, чьи имена начинаются с точки ('.'), быть возвращенными в результате раскрытия имени пути ( при использовании символов *,?, [] в командах - прим. переводчика ).
  extglob

Эта опция позволяет вам использовать расширенный поиск по шаблону в стиле команды egrep ksh-88 или, другими словами, сверх-развитый поиск по шаблону в bash. Доступные операторы:

?(шаблон)
Соответствует количеству появлений указанного шаблона, равному нулю или единице
*(шаблон)
Соответствует количеству появлений указанного шаблона, равному нулю или больше
+(шаблон)
Соответствует одному или большему количеству появлений указанного шаблона
@(шаблон)
Соответствует одному появлению указанного шаблона
!(шаблон)
Соответствует всему, кроме одного появления указанного шаблона

Вот пример. Скажем, вы хотите установить все RPM-файлы в указанном каталоге, кроме тех, которые собраны для архитектуры noarch. Вы можете использовать что-нибудь типа этого:

rpm -Uvh /usr/src/RPMS/!(*noarch*)

Эти выражения могут быть также сгруппированы, тогда, если вы хотите вывести список всех не-PDF и не-Postscript файлов в текущем каталоге, вы можете сделать так:

ls -lad !(*.p?(df|s))

readline: советы и приемы эффективной работы

Библиотека readline используется bash и многими другими программами для чтения строк с терминала, позволяя пользователю исправлять введенные строки с помощью стандартных клавиш редактирования Emacs.

  • set show-all-if-ambiguous on
    Если данная команда есть в вашем /etc/inputrc или ~/.inputrc, вам больше не нужно жать дважды клавишу чтобы вывести список всех возможных вариантов автозаполнения. Одного нажатия будет достаточно.
  • set visible-stats on
    Добавление данной команды в ваш /etc/inputrc или ~/.inputrc будет результатом добавления символа типа файла в конце имени каждого файла, возвращенного при автозаполнении, точно так же как при использовании ls -F.

Программируемое автозаполнение

Введение

Сравнительно новая возможность в bash – программируемое автозаполнение, которое доступно, начиная с бета-версии 2.04. Программируемое автозаполнение знакомо вам, если вы пользователь zsh. Оно также присутствует, хотя в менее удобной форме, в tcsh.

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

Стандартное автозаполнение

bash предлагает много форм автозаполнения с самого начала, включая путь, имя файла, пользователя, хоста и переменной.

  • Автозаполнение пути
    Этот тип автозаполнения встречается в первом слове командной строки, позволяя вам заканчивать имена исполняемых файлов. Вместе с автозаполнением имени файла, это наиболее известный и используемый тип.
  • Автозаполнение имени файла
    Позволяет завершать имена файлов и директорий во втором и последующих словах в командной строке.
  • Автозаполнение имени пользователя
    Позволяет завершать имена пользователей, предваряя их символом ~ (тильда).
  • Автозаполнение имени хоста
    Позволяет завершать имена хостов, предваряя их символом @.
  • Автозаполнение имени переменной
    Позволяет завершать имена переменных, предваряя их символом $.

Программируемое автозаполнение бесконечно увеличивает количество типов автозаполнения.

Механика

Детальное описание механики программируемого автозаполнения появится здесь через некоторое время.

Download

Следующие файлы доступны для скачивания. Все они сделаны доступными под лицензией GNU General Public License.

Файл Тип
bash-completion-20020209.tar.gz Исходные файлы, упакованные tar и gzip для bash версий 2.05 и выше
Changelog Список изменений bash_completion из CVS
bash-completion-20020209-1.noarch.rpm RPM для bash версий 2.05-12 и выше
bash-completion-20020209-1.src.rpm SRPM для bash версий 2.05-12 и выше
bash-2.05a-service_completion.patch Патч (от 20020207) для bash версии 2.05a для добавления автозаполнения имени службы
bash-2.05a-53.i386.rpm RPM bash 2.05a с установленными патчами
bash-doc-2.05a-53.i386.rpm RPM с документацией к bash 2.05a
bash-2.05a-53.src.rpm SRPM bash 2.05a с установленными патчами
bash-2.05-group_completion.patch Патч для bash 2.05 для добавления автозаполнения имени группы
bash-2.05-service_completion.patch Патч для bash 2.05 для добавления автозаполнения имени службы (требует предварительно установленного патча для автозаполнения имени группы)
bash-2.05-12.i386.rpm RPM bash 2.05 с установленными патчами
bash-doc-2.05-12.i386.rpm RPM с документацией к bash 2.05
bash-2.05-12.src.rpm SRPM bash 2.05 с установленными патчами

Установка

Если вы хотите установить собранный RPM, запустите следующую команду из-под root:

# rpm -Uvh bash-completion-xxxxxxxx-x.noarch.rpm

После чего вы обнаружите новый файл в своей системе, /etc/bash_completion. Если вы не добавляли параметр --noscripts при вызове rpm, когда делали установку, скрипт RPM, вызываемый после установки, изменит ваш /etc/bashrc так, чтобы он содержал следующий кусок кода:

# START bash completion -- do not remove this line
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ "$PS1" ] && [ $bmajor -eq 2 ] && [ $bminor '>' 04 ] && [ -f /etc/bash_completion ]; then
 # interactive shell
 # Source completion code
 . /etc/bash_completion
fi
unset bash bmajor bminor
# END bash completion -- do not remove this line

Если вы устанавливаете файл с исходниками, упакованный либо gunzip, либо bunzip2, положите его куда-нибудь в своей системе и добавьте вышеуказанный код либо в /etc/bashrc, либо в ~/.bashrc. Если вы положили исходник куда-нибудь еще, кроме /etc/bash_completion, вам нужно отредактировать начало, чтобы переменная $BASH_COMPLETION указывала на правильное расположение файла bash_completion.

Строка, которая вам нужна:

[ -z "$BASH_COMPLETION" ] && declare -r BASH_COMPLETION=/etc/bash_completion

Начало работы

Вы можете получить полный список всех команд, которые были связаны с автозаполнением, выполнив команду complete -p. Дополнительно, команда declare -f покажет вам код всех функций shell, включая те, что связаны с автозаполнением.

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

Если вы сисадмин, вы найдете автозаполнение ssh особенно полезным, поскольку оно завершает имена хостов по содержимому из файлов known_hosts. Также если вы монтируете NFS-партиции с большого количества хостов, попробуйте набрать mount имя хоста:.

Программисты возможно сочтут полезным автозаполнение параметров p4 и cvs.

Исправление ошибок и дополнения

Если вы найдете какие-либо ошибки или пожелаете сделать какие-либо дополнения, я буду счастлив получить ваши патчи к коду. Особенно кстати будут автозаполнение параметров gcc и полная обработка параметров cvs. Еще одна огромная просьба – сделать код более портируемым без замедления работы. Патчи во всех этих областях приветствуются.

Новые релизы

подпишитесь на извещение о новых версиях.

Связь со мной

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

Советы и приемы эффективной работы в bash


Обсудить данную тему на нашем форуме "Все о Linux"