Pull to refresh

Comments 76

Автору спасибо — почерпнул новые знания, статью в мемы, а заплюсую завтра — сегодня мана кончилась =)
cd -
переход в предыщую директорую
например

$ pwd
/usr/local/include/boost
$ cd
bogolt@view:~$ cd -
/usr/local/include/boost

тут мы из директории /usr/local/include/boost перешли в домашнуюю, а потом с помощью 'cd -' вернулись в предыщую
Точно! Забыл об этом упомянуть :) Спасибо!
~$ shopt -s autocd
~$ /tmp
cd /tmp
/tmp$ /etc/init.d
cd /etc/init.d
/etc/init.d$ -
/tmp
/tmp$ ~
~$
Самая полезная фича для меня Ctrl-R — реверсивный поиск. Позволяет найти команду в истории по ее части, и не только запустить заново, но и отредактировать перед этим.
Ага! А все следующие Ctrl-R будут пытаться найти другие совпадения.
Что-то не точно сформулировал свою мысль.
Все последующие нажатия комбинации Ctrl-R будут пытаться найти другие команды в истории по уже введённому контексту. Т.е. ввели известную нам подстроку и нажимаем Ctrl-R до тех пор, пока не найдём нужную команду.
Спасибо, пару удобных комбинаций не знал.
Операции с курсором, кстати — это не Bash, это readline. И ещё он умеет работать в vi-режиме (почти всё поддерживается)

$ set -o vi

что намного удобнее может быть для редактирования.
«Удобнее для тех, кто знаком с vi»
Эмс… Почему это? Можно и через этот режим познакомиться с тем, как работается в Vi. Один фиг — надо всякие нажималки магические запоминать. По-умолчанию стоит emacs режим, но вы же не считаете, что он удобнее только для тех, кто знаком с emacs.

Вот. Так что, попробовать стоит. IMHO, всё же Vi устроен логичнее, да и искать всякими regexp'ами позволяет по истории, что может быть полезнее.
Я то знаю, я его и использую уже давно. Не забывайте что большинство считает что у vi есть всего два режима. И всё же «порог вхождения» у emacs ниже чем у vi\vim =)
О. Вот про порог вхождения не соглашусь. Я в Emacs так и не вошёл, например. Хотя пытался раза три. Уж слишком там много магических последовательностей нужно запоминать. vim как-то в этом плане более интуитивно понятный.
Ну это для Вас. Для большинства новичков которых я видел\знаю vi сложнее. Нажать Ctrl-a же проще и понятнее, чем Esc затем, Shift-a
Ну… Я ж — не уникальная в этом личность. Для многих vim оказывается проще, поэтому я и упомянул про vi-режим readline. Да и потом, я же тоже пытался в Emacs войти с уровня новичка. Но вот почему-то проще оказалось войти в Vim. Хотя, вроде как, формально, действительно проще нажимать ctrl-a, а не esc, shift-a… Но вот почему-то Emacs не пошёл у меня.
Мы с Вами просто относимся к тем, кому удобнее vi, но, как показывает статистика, нас меньшинство :)
Да почему? Вот статистика использования пакетов в Arch Linux

www.archlinux.de/?page=FunStatistics

Нужно учитывать, что nano и vi там ставятся по умолчанию при инсталляции системы, а вот Vim, Gedit, Emacs уже надо устанавливать руками. Ну… Как бы… Arch, конечно, не mainstream дистрибутив, но всё же.
Вот именно что не мейнстрим. Есть куча новичков в *NIX системах, для которых vi не так лёгок в освоении :)
хм. А как пользоваться? Вот я башу сказал set -o vi, а дальше? ниче не поменялось вроде в поведении readline.
Esc для выхода из режима вставки попробуйте
Ну. Надо же ещё документацию почитать. Возможностей, по идее, не больше, просто пользоваться может быть удобнее. На любителя всё конечно.

Но, например, вот бывает такое удобство… Допустим, хотим поискать нечто (find) с некими экзотическими ключиками, которые вспоминать лень. Для этого…

1. Жмём Esc — вошли в командный режим
2. Пишем /find — это поиск в истории. Жмём enter. Жмём n или N пока не находим нужное вхождение:

find 'a b c d' -type f -a --newer…

3. Жмём 0 — попадаем в начало строки. Жмём f' — переходим на первую кавычку, жмём c; — замена всего до следующей кавычки (; — повтор предыдушей команды перемещения, и заменяем путь для поиска:

find 'some path' -type f -a --newer…

Самое удобное в vi режиме — это как раз навигация по символам в командной строке. Можно ещё куски копировать. Например, можно было бы жмахнуть y; — и получить путь в 'буфере обмена'. По моим личным ощущениям — это удобнее, чем emacs.
Это просто невообразимо круто! Спасибо тебе добрый человек)
Кстати странно, что всё это отсутствует почти во всех руководствах по баш и учебников по линукс, так же как и большинство горячих клавиш. Я когда только начинал познавать линукс, то далеко не из первой книжки по этой системе узнал о существовании ctrl+alt+f(1-12), что весьма странно, вроде и основы, а в книжках для чайника про это нет.
Ctrl+R — поиск по истории. начинаешь печатать, а консолька сама подставляет подходящие команды.
Esc+. — подстановка в команду последнего аргумента предыдущей команды. Дьявольски удобно.
> Майка Лукидиса
Уставшими глазами прочел «Майка Линуксоида» :)

А за статью большое спасибо, в избранное!
alias-ы тоже полезны

alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
alias psx="ps -auxw | grep $1"
...
А у меня вот такое лежит в алиасах.

function kkill()
{
kill $(pgrep $1)
}

Если нужно прибить процесс, просто жму k+k+[Tab] и вписываю имя неугодного процесса.
ps -A тоже на алиасе, для удобства.
ой, не совсем точно описал! k+k+[Tab] и вписываю фрагмент из имени.
Предположим, мы занимались до этого рукоблудием и играли в «Сапера». Для его умерщвления достаточно выполнить kkill mine.
Мне так удобнее, да и проще клацнуть два «k» с табом, чем k+i+l+l+a+[Tab]… Но, это дело вкуса.
ещё вспомнил в копилку: Ctrl+L очищает экран.
Предпочитаю использовать команду 'reset' (это не перезагрузка, просто сброс консоли). Помогает, когда шеллу сносит крышу от кривых esc-последовательностей. Заодно сбрасывает весь буфер, в то время как после Ctrl+L можно тупо проскроллить вверх и увидеть всё выше. (И зачем тогда чистить экран?)
Ну, очистить экран чтобы вся выведенная на нём до этого информация не отвлекала от работы.
А вот фича, которую я люблю даже больше CTRL-R:

$ cat .inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward


А теперь наберите в консоли:

$ cat

И курсором вверх-вниз для показа последних комманд, начинающихся на cat(или что угодно другое).
согласен, это куда полезнее зачастую :)
'man bash' вам в помощь!

в главе Readline Command Names приведен полный список команд.

мой хит-парад — C-u, C-w, C-y, M-#
zsh попробуйте — оч. много интерактивных приятностей
И отсутствие привычного readline. Поначалу напрягает.
Я удаленно администрирую больше 10 юниксовых серверов, мне в принципе будет неудобно метаться между разными шеллами, запоминать кучу комбинаций клавиш и т.д. На всех моих серверах по умолчанию идет bash, поэтому все описанное мной здесь работает куда бы я не залогинился (ну кроме одной машиной с AIX, там Korn shell).
А zsh это, конечно, очень хорошо, но дальше домашней машины и ноута он не выходит.
Согласен полностью. Но ещё более согласен если не только вы их администрите. На серверах и вообще шаредных компах в руте используем bash почти в голом виде, с минимумом алиасов. И вим гол как сокол. В таких вещах чем стандартнее тем лучше (про судо знаю, но у нас всё равно рут для админов — причины есть). А в скриптах, конечно, первой строкой — банг-баш.
Еще к удобствам можно отнести работу с хистори и настройку окружения:
1. Ведение лога истории с datestamp'ом:
export HISTTIMEFORMAT='%F %T '
2. Занесение команды в .bash_history сразу же, после нажатия enter (а не после завершения сеанса), что весьма удобно при одновременной работе в нескольких сессиях:
PROMPT_COMMAND='history -a;history -n'
3. Удобная настройка PS1 (чтобы было видно и юзера/хост и желательно дату и время [у меня некоторые сессии висят неделями])
export PS1='\033[00;32m\][`date +%d" "%h" "%Y" "%T`] \u@\h \w\n \$\[\033[00m\] '
4. Увеличение размера хистори (при активной работе 500 — это очень мало)
export HISTSIZE=100500
5. Говорим башу не заносить в хистори повторяющиеся друг за другом команды:
export HISTCONTROL=ignoredups
6. Отключаем занесение «бесполезных» с точки зрения истории команд:
export HISTIGNORE="&:ls:[bf]g:exit:[ ]*:ssh:history"
7. Не забываем про bash_completition (который предварительно надо не забыть подключить):
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
— 8. $ ls some-file
$ cp !$ !$.back
( !$ — заменяется на последний аргумент [в данном случае some-file] )
9. фича только для bash 4 и выше (в 3, емнип, не работает)
shopt -s globstar
и echo ** будет практически равносилен find.
Вроде все, что вспомнил (:
Еще нравится:
cp /etc/very/long/path/{filename.txt,newname.txt}

Эх, заранее отправилось. Продолжу:

cp /etc/very/long/path/filename.txt{,.bak} # равносильно cp /etc/very/long/path/filename.txt /etc/very/long/path/filename.txt.bak
mv /etc/very/long/path/filename.txt{,.bak} # равносильно mv /etc/very/long/path/filename.txt /etc/very/long/path/filename.txt.bak
Хоть по сути к bash'у это относится лишь косвенно, но я бы ещё упомянул о каких-нибудь сторонних утилитах, упрощающих работу в консоли. К примеру screen. Очень удобно держать в консоли несколько подписанных вкладок и перемещаться по ним по хоткеям (Ctrl + RightArrow/LeftArrow, например). У меня всегда открыто 5 вкладок, которыми активно пользуюсь.
такие элементарные вещи.
очень часто забываешь про них, и половину из всего этого не знал. спасибо что научили и освежили память.
выполнение предыдущец команды из под рута: sudo!!!
поиск файла в система: locate file.name (предварительно совершив updatedb)
А как же божественные Ctrl-p\n? Это куда удобнее чем тянуться к стрелочкам.

Как Ctrl-A мнемонически соотносится со словом Home?
это комбинации клавиш из емакса. Мнемоника там не причем
круто, а запоминать как?
буква А — начало алфавита — начало строки.
буква E в Ctrl+E, — видимо, конец алфавита? ;) Всё-таки неинтуитивные шорткаты.
UFO landed and left these words here
alias pingy=ping ya.ru
alias tracy=traceroute ya.ru

Если провайдеру не доверяете.
UFO landed and left these words here
То, что работает во всех шеллах, а не только в bash, для временного захода в какой-то каталог и возврата обратно: запустить ещё один экземпляр оболочки и там сделать всё необходимое.
Ниженаписанное делалось в FreeBSD в csh.
[/usr/local/etc/rc.d] 23:53 kibab@kibab-nb%csh
[/usr/local/etc/rc.d] 23:53 kibab@kibab-nb%cd /etc/
[/etc] 23:54 kibab@kibab-nb%grep -r someCrappyJob rc.conf
[/etc] 23:54 kibab@kibab-nb%exit
[/usr/local/etc/rc.d] 23:54 kibab@kibab-nb%


Кстати, в данном случае я не набирал «exit», а просто нажал Ctrl-D: конец потока стандартного ввода, что завершает шелл.

Мой пример можно было бы сделать ещё и вот так:
[/usr/local/etc/rc.d] 23:57 kibab@kibab-nb%(cd /etc/ && grep someCrappyJob rc.conf)
[/usr/local/etc/rc.d] 23:57 kibab@kibab-nb%

… но это уже другая история :-) Собсна, скобки — это шорткат для запуска дочернего шелла и команды в нём.
Вот с переменными только проблемы у незнающих возникнут при использовании подшеллов. Что-то типа
$ (A=1); echo $A
может вызвать как минимум удивление (:

Да далеко не всегда нужны подшеллы. Команды можно группировать фигурными скобками {}:
$ [ $(($RANDOM%2)) -eq 0 ] && { echo 'Even'; echo 'It works!'; } || { echo 'Odd'; echo 'It doesnt work!'; }
ничего нового, всё уже есть на хабре, и даже не особо не разбросано по отдельным постам.
Оформил в виде памятки:
  1. CTRL+R — вводишь слово, с которым надо найти команду в истории. Повторные CTRL+R перебирают все команды в истории с этим словом.
  2. CTRL+L — очистка экрана. Я обычно писал набирал clear [enter]> для этого.
  3. CTRL+A — замена HOME, CTRL+E — end
  4. CTRL+U — удаление текста от курсора до начала строки, CTRL+K — удаление от курсора до конца строки, CTRL+Y — вставить удаленный предыдущими примерами кусок текста, CTRL+C — удаление всей строки (обычно работает как отмена команды).
  5. CTRL+T — меняет местами символ под курсором и предыдущий набранный (при опечатке вида /dev/dsa вместо /dev/sda)
  6. ^^ — нет это не смайлик. После попытки выполнить команду, набранную с ошибкой, строка вида ^ошибка^правильно запустит на выполнение исправленную команду.
  7. # — если вместо набранной команды надо сначала выполнить другую, можно закомментировать строку и нажать [enter], впоследствии вернуться к команде в истории, раскомментировать и выполнить.
  8. ALT+. — подставляет к текущей команде аргумент предыдущей. Например, чтобы после команды ls [длинный путь] не набирать этот путь для перехода в директорию, можно набрать cd + «Alt+.» + «ENTER»
  9. Добавляем в ~/.inputrc строчки:
    "\e[A": history-search-backward
    "\e[B": history-search-forward

    Теперь для поиска команды в истории достаточно ввести первые буквы и перебирать варианты стрелками вверх/вниз.
  10. sudo !! — выполнить предыдущую команду через sudo.


Работу с хистори и настройка окружения (для постоянного использования добавить в .bashrc)

1. Ведение лога истории с datestamp'ом:
export HISTTIMEFORMAT='%F %T '

2. Занесение команды в .bash_history сразу же, после нажатия enter (а не после завершения сеанса), что весьма удобно при одновременной работе в нескольких сессиях:
PROMPT_COMMAND='history -a;history -n'

3. Удобная настройка PS1 (чтобы было видно и юзера/хост и желательно дату и время [у меня некоторые сессии висят неделями])
export PS1='\033[00;32m\][`date +%d" "%h" "%Y" "%T`] \u@\h \w\n \$\[\033[00m\] '

4. Увеличение размера хистори (при активной работе 500 — это очень мало)
export HISTSIZE=100500

5. Говорим башу не заносить в хистори повторяющиеся друг за другом команды:
export HISTCONTROL=ignoredups

6. Отключаем занесение «бесполезных» с точки зрения истории команд:
export HISTIGNORE="&:ls:[bf]g:exit:[ ]*:ssh:history"

7. Используем «сокращения» для популярных комманд:
alias u='sudo pacman -Syu'
alias extmonitor='xrandr --output VGA1 --auto --primary && xrandr --rate 72 && xrandr --output LVDS1 --off'
alias intmonitor='xrandr --output LVDS1 --auto --primary && xrandr --output VGA1 --off'
А подскажите, для виндовых «мигрантов», как из консоли открыть файл в ассоциированной программе. В винде было удобно, набираешь file.pdf и все. А тут как?

Ubuntu 10.04 + Gnome, если это важно.
Можно дописать в .bashrc
alias x=«xdg-open»

Получаем
$ x %f
чтобы вызвать файл под курсором в mc
$ x.
чтобы открыть папку, в которой находишься
Спасибо, так и сделал. Только в .bashrc в комментах советуют алиасы кидать в .bash_aliases, добавил туда.
UFO landed and left these words here
UFO landed and left these words here
Вот если бы еще все трюки из комментариев (допустим, из заплюсованных) скопировать в тело статьи…
многие сочетания клавиш, например Ctrl+A и Ctrl+E не работают в screen по умолчанию, т.к. перекрываются дефолтные сочетаниями вроде Ctrl+A+A.
Возможно ли включить стандартные сочетания в screen?
man screen: C-a a.
Т.е. Ctrl-a,a пошлет в консоль Ctrl-a.

по опции -e можно указать иную управляющую escape последовательность.

Ctrl-e у меня в screen работает.
Странно что не указали Alt-f и Alt-b — движение курсора вправо/влево по словам.
Only those users with full accounts are able to leave comments. Log in, please.