Ключевые слова:bash, shell, console, (найти похожие документы)
From: Tigro <http://tigro.info> и EraZer <http://storinka.com.ua>
Date: Mon, 3 Jan 2008 14:31:37 +0000 (UTC)
Subject: Удобная работа в Bash
Оригинал: http://tigro.info/blog/index.php?id=418http://storinka.com.ua/2007/12/25/udobnaya-rabota-v-bash/
Тут приведены некоторые полезные хитрости, направленные на более
удобное использование командной строки. Все мы не хотим повторно
набирать какую-то длинную команду и ищем ее в истории. Тут - пара
трюков от том, как можно энто самое удобство малость повысить.
1. Потеря комманд в .history
Многие пользуются стандартными гномовским или кдешным эмуляторами
терминала. У них есть возможность открывать в одном окне несколько
оболочек - каждую в отдельной вкладке.
bash по умолчанию пишет в историю набранные за сеанс команды только
при своем закрытии (перед самоликвидацией). Поэтому при открытии
нового терминала в другой вкладке вы не увидите только что набранные
команды из первой вкладки - они еще не записаны в хистори.
К тому же закрыв первый терминал, а потом второй вы не найдете в
истории команд набранных в первом терминале. Потому что по умолчанию
bash не дописывает файл .history, а переписывает.
Исправить ситуацию можно, дописав в конфигурационный файл ~/.bashrc
пару строк
shopt -s histappend
PROMPT_COMMAND='history -a'
Теперь каждая введенная вами команда будет писаться в историю сразу
же. Не бойтесь - дырку на жестком месте такая конфигурация не протрет.
Не так уж часто вы команды в баше набираете. :) Да и слава богу
кеширование дисков пока еще рулит.
2. Эвристическое исправление ошибок директорий
Если дописать такую строчку
shopt -s cdspell
то bash будет пытаться исправлять допущенные вами опечатки (пропуски и
перестановки символов, например /ect/init.d вместо /etc/init.d) в пути
у команды cd. Не бойтесь, у rm такая фича работать уже не будет.
Только у cd.
3. Не писать в историю подряд идущие строки-дубликаты
Пишем в ~/.bashrc
export HISTCONTROL="ignoredups"
А если вы не хотите, чтобы в историю попадали вызовы каких-то
"неинформативных" команд, то их логирование можно запретить:
export HISTIGNORE="&:ls:[bf]g:exit"
После этой команды в хистори не будут писаться команды &, ls, bg, fg,
exit. Можно дописать и свои, через двоеточие, можно использовать
шаблоны.
4. Не разрывать многострочные команды
Еще команда в конфигурационный файл
shopt -s cmdhist
5. Поиск по истории команд
Иногда команды бывают большими и сложными, и чтобы заново ее не писать
и не искать по истории 100 раз нажимая "вверх", можно воспользоваться
поиском.
Если вы помните кусочек команды которую хотите найти, то можно просто
нажать в bash'e комбинацию Ctrl + R и набрать этот кусочек. bash вам
покажет последнюю команду с такой подстрокой. Можно продолжать
нажимать Ctrl + R и bash будет выдавать более старые подходящие
команды, подходящие под искомую строку.
6. Вернуться в предыдущую директорию
Когда мы работаем в какой-то директории, и нам нужно "выбраться" в
другую директорию, что-то там поделать и вернуться назад, можно
воспользоваться "cd -", например
[kpblca@localhost html]$ cd /var/www/html
[kpblca@localhost html]$ cd /etc/
[kpblca@localhost etc]$ vi my.cnf
[kpblca@localhost etc]$ cd -
/var/www/html
[kpblca@localhost html]$
Эта команда вернет нас в директорию где мы были раньше.
ЗЫЖ
Дополнительно можно почитать man bash и найти там описание всех опций
у shopt. Может быть еще что-то вам тоже пригодится.
Для многих Linux-дистрибутивов в качестве командной оболочки по
умолчанию используется Bash. Часто, в процессе работы с данной
оболочкой "достают" те или иные неудобства, но на поиски их решения
либо нет времени, либо просто много лени... В данном выпуске описаны
некоторые раздражающие в работе моменты и возможные пути их решения.
1. Затирание истории команд
Если вы работаете в терминале, то при открытии второго терминала
последний не будет "помнить" тех команд, что вы вводили только что в
первом. К тому же, если вы закроете первый терминал, а чуть позже -
второй, то сохранится только история команд второго терминала
(последнего закрытого).
Так происходит потому что запись истории команд происходит в момент
закрытия терминала, - а не после каждой введенной команды.
Решение:
В файл ~/.bashrc добавить такие строки:
shopt -s histappend
PROMPT_COMMAND='history -a'
Это приведет к тому, что Bash впредь будет дополнять историю команд, а
не перезаписывать ее.
2. Случайные опечатки
Бывает, что при быстром наборе команды, вы пишете, например, "ect"
вместо "etc" - и узнаете об ошибке только набрав километровой длины
строку и нажав Enter...
Решение:
В этом случае может помочь указание в файле .bashrc такой строки
shopt -s cdspell
Теперь после ввода команды "cd /ect" вы попадете в каталог "/etc"
3. Дубликаты команд в хистори
Часто в работе приходится давать несколько одинаковых команд подряд.
Например "cd .." или "ps ax | grep something". В результате, история
команд захламляется дубликатами строк, после чего бывает непросто
добраться до истории команд, введенных ранее.
Решение:
добавить в .bashrc строку
export HISTCONTROL="ignoredupes"
Это избавит от записи в истории дубликатов команд. Можно пойти еще
дальше, и запретить запись в историю команд ls, bg, fg и exit.
Делается это добавлением строки
export HISTIGNORE="&:ls:[bf]g:exit"
4. Многострочные команды разбиваются в истории на несколько строк
При наборе команды в несколько строк, она сохраняется в истории как
набор не связанных между собой строк. Что бывает совсем неудобно.
Решение:
Добавить в файл .bashrc строку
shopt -s cmdhist
После этого можно будет вызывать многострочные команды из хистори
одной строкой.
5. Быстрый поиск команды в хистори
Чтобы найти какуюлибо команду (например, ping) в истории, можно
сделать так:
history | grep "foo"
Но это неудобно и совсем не функционально.
Решение:
Нажать комбинацию клавиш CTRL+R - после этого найти нужную команду по
вводимому сочетанию букв.
6. Как перейти в последнюю директорию?
При работе часто возникает ситуация, когда нужно сделать что-либо, а
для этого приходится метаться между двумя директориями. Каждый раз
набирать имя директории (пусть даже используя автодополнение) -
неудобно.
Решение:
Использовать команду
cd -
После чего вы перейдете в директорию, в которой только что были (до
выполнения этой команды).
7. Как обратиться к объекту, с которым только что работал?
Представим ситуацию: сисадмин проводит неспешный осмотр каталогов
своих пользователей, вытирая в процессе "ненужный хлам" - например,
заготовленные непосильным трудом несколько гигабайт мп3-музыки.
Положим, что делает он это примерно так:
ls /home/user/mp3
rm -rf /home/user/mp3
В данном случае будет полезно воспользоваться таким сочетанием клавиш:
ESC . (нажать "ESC", а потом "." последовательно)
Как результат, сработает автодополнение, используя объект, к которому
было последнее обращение. В данном случае, если набрать команду "ls
/home/user/mp3'', затем набрать "rm -rf" и потом нажать
последовательно ESC и . - то после набранного "rm -rf" командная
строка автоматически дополнится "/home/user/mp3''.
Вроде как вместо " . (нажать "ESC", а потом "." последовательно)" гораздо удобнее (в плане быстрее) набрать !$ - эти два знака заменятся на последнюю часть аргумента (до пробела) прошлой команды.