Советы и подсказки по bash

Автор оригинала: richbradshaw.wordpress.com
  • Перевод
Для непосвященных, bash — командная оболочка по умолчанию во многих Linux-дистрибутивах, включая Fedora, Ubuntu, Redhat и др. Используя операционную систему Linux-семейства, вы, вероятно, используете и bash. По этой причине ниже я собрал несколько часто возникающих проблем с bash и простые способы их решения.

1. Потеря истории команд

Если открыть окно терминала и ввести несколько команд, а после открыть второе окно, то история команд bash во втором окне не будет содержать команд из первого. К тому же, если закрыть первый терминал, а затем второй, то история команд из первого терминала будет перезаписана вторым. Вдвойне неприятно!

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

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

nano ~/.bashrc

sudo здесь не нужно, это файл пользователя, а не настройка системы. Мне нравится nano, но можно использовать любой редактор: gedit, kate, mousepad, vi или emacs

добавить строки

shopt -s histappend

PROMPT_COMMAND='history -a'

И сохранить. (Ctrl-O для записи. "^" означает клавишу «Ctrl» в nano и других программах. ^X для выхода)

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

2. Глупые ошибки в написании

Добавьте

shopt -s cdspell

опять-таки в .bashrc. Таким образом ошибки в написании (например, ect вместо etc) будут исправляться.

3. Дубликаты в истории команд

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

Добавьте

export HISTCONTROL="ignoredups"

опять таки к .bashrc.

Или даже лучше, добавьте

export HISTIGNORE="&:ls:[bf]g:exit"

Это позволит избавиться от дубликатов, а также от ls, bg, fg и exit, что сделает историю команд bash более читабельной.

4. Разорванные многострочные команды в истории команд

Добавьте

shopt -s cmdhist

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

5. Пара дополнительных советов от комментаторов

Нажмите Ctrl-R в bash, далее начните набирать команду. Так искать в истории команд гораздо быстрее, чем нажимать 300 раз «вверх».

Также можно искать при помощи

history | grep "foo"

Команда

cd -

осуществляет возврат к последней посещенной директории — бывает полезно, когда нужно перейти куда-то чтобы что-то изменить, а затем быстро вернуться назад.

Нажатие «Esc»+"." вызывает последний упомянутый объект. Например, если набрать cat /etc/apt/sources.list, а затем rm и нажать «Esc»+".", то команда будет автоматически завершена: rm /etc/apt/sources.list. Попробуйте!

Заключение

Вот несколько советов, как сделать историю команд bash удобней. Если у вас есть свои хитрости на этот счет, добавляйте в комментарии!

Via Linux в digg на русском
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 23

    +4
    Спасибо, хорошая статья. Кстати очень удобно пользоваться Yakuake вместо обычной консоли. мегаудобная штука.
      0
      А, я пробовал, мне чего-то не понравилось. Давно правда.
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          сейчас 2.8 версия стабильно работает. раньше тоже замечал за ней глюки
          +3
          или tilda в случае Gnome
            0
            Ага. Только с переназначением сочетаний клавиш были проблемы, пришлось привыкать к неудобным заводским.
              0
              Когда-то пробовал. Но несмотря на то, что основан он на KDE'шной Konsole, многих её функций мне не хватало. В то же время идея "терминал на хоткее" тоже очень удачна. И я написал скрипт, который делает то же самое с Konsole (если открыта - скрывает, если скрыта или перекрыта другими окнами - поднимает) и назначил его запуск на горячую клавишу.
              dcoprefs=`dcop | grep konsole`
              for instance in $dcoprefs ;do
              shown=`dcop $instance konsole-mainwindow#1 isActiveWindow`
              if [ "$shown" == "true" ] ;
              then
              dcop $instance konsole-mainwindow#1 hide
              else
              dcop $instance konsole-mainwindow#1 hide
              dcop $instance konsole-mainwindow#1 restore
              fi
              done
              0
              Огромное спасибо. Не забавно-бесполезная, а действительно ценная статья, оптимизирующая повседневную работу.
              Конечно, для максимальной пользы надо бы читать мануалы... но... =)
                0
                Классная статья.
                  +7
                  Очень полезеной и удобной оказалась для меня следующая вещь.
                  Поиск по введенному префиксу. То есть набираем "cd " и при нажатии вверх-вниз видим только комманды начинающеися с "cd ". По мне это удобнее чем использовать Ctrl+R

                  Итак открываем на редактирование файл ~/.inputrc и записываем туда

                  "\e[A": history-search-backward
                  "\e[B": history-search-forward


                  Вот и все.

                  Второй совет - увеличте размер истории.
                  export HISTFILESIZE=3000
                  Много истории не бывает.
                    0
                    О! Вот за это спасибо огромное - этого как раз мне в bash очень не хватало!
                      0
                      да, просто отлично, спасибо. уже давно наблюдаю такую удобность где угодно, только не в bash. оказывается, просто включить надо... правда, как-то неочевидно.
                        0
                        Странно в Gentoo по умолчанию тоже самое делается по PageUP, PageDown. Я чесно говоря думал это стандартная фишка bash. Поправте меня если я не прав.
                          0
                          ого! спасибо, я этого не знал =)
                          0
                          что-то мне записывание в .inputrc ничем не помогло - а это что за файл такой, кто его читает? вперые слышу о нем
                          0
                          ескейп с точкой полезно. спасибо. я что-то не знал такого.
                            0
                            Вместо искейп с точкой мне удобнее написать !$.
                              +3
                              Удобный макрос для распаковки архивов.

                              добавьте в .bashrc строки

                              # Extract files from any archive
                              # Usage: ex <archive_name>
                              ex () {
                              if [ -f $1 ] ; then
                              case $1 in
                              *.tar.bz2) tar xjf $1 ;;
                              *.tar.gz) tar xzf $1 ;;
                              *.bz2) bunzip2 $1 ;;
                              *.rar) rar x $1 ;;
                              *.gz) gunzip $1 ;;
                              *.tar) tar xf $1 ;;
                              *.tbz2) tar xjf $1 ;;
                              *.tgz) tar xzf $1 ;;
                              *.zip) unzip $1 ;;
                              *.Z) uncompress $1 ;;
                              *.7z) 7z x $1 ;;
                              *) echo "'$1' cannot be extracted via extract()" ;;
                              esac
                              else
                              echo "'$1' is not a valid file"
                              fi
                              }


                              Используйте ex _archive_name_.

                              +33 bash-совета
                                +1
                                zsh :]
                                  0
                                  Вот взгляд рассовый и правильный ©
                                  0
                                  Для вывода времени когда команда вызывалась использовать:

                                  export HISTTIMEFORMAT='%h.%d %H:%M '
                                    0
                                    Оффт:
                                    Только я поначалу прочёл 's histappend' неверно?
                                      0
                                      Спасибо за статью!

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое