Более продуктивная работа с bash 2.x
Перевод : Яна Макдональда (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 предлагает много форм автозаполнения с самого начала, включая путь, имя файла, пользователя, хоста и переменной.
-
Автозаполнение пути
Этот тип автозаполнения встречается в первом слове командной строки, позволяя вам заканчивать имена исполняемых файлов. Вместе с автозаполнением имени файла, это наиболее известный и используемый тип.
-
Автозаполнение имени файла
Позволяет завершать имена файлов и директорий во втором и последующих словах в командной строке.
-
Автозаполнение имени пользователя
Позволяет завершать имена пользователей, предваряя их символом ~ (тильда).
-
Автозаполнение имени хоста
Позволяет завершать имена хостов, предваряя их символом @.
-
Автозаполнение имени переменной
Позволяет завершать имена переменных, предваряя их символом $.
Программируемое автозаполнение бесконечно увеличивает количество типов автозаполнения.
Механика
Детальное описание механики программируемого автозаполнения появится здесь через некоторое время.
Следующие файлы доступны для скачивания. Все они сделаны доступными под лицензией 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