Комментарии 215
rm -rf
ух ты, про "<пробел>команда" не знал, до сих пор огород горожу с автоочисткой истории для вычищения паролей. Век живи — век учись.
$ kill -9 $$
Это работает далеко не всегда. Просто иногда в rc файле объявлена export HISTIGNORE="[ ]*" ( ну или нечто подобное ). Когда этого нет, все команды с пробелами впереди точно так же сохраняются.
А зачем Вам вообще эта история? Я много лет назад прописал общесистемно (в
/etc/env.d/99local
):HISTFILE="/dev/null"
и с тех пор было может пяток случаев, когда я пару секунд жалел, что нет истории команд. Фокус в том, что во-первых история по-прежнему доступна пока не закроется терминал, а во-вторых стандартный подход с сохранением истории в файле не очень-то хорошо работает, когда одновременно открыто несколько терминалов (а у меня штатно открыто всегда 15). Делал я это из соображений безопасности, но был поражён, насколько слабо это отразилось на юзабилити.Привожу часть моего .bashrc.
Последние строчки позволяют сохранять историю хоть в 100, одновременно открытых терминалах.
#Чтобы одинаковые команды не сохранялись в истории, добавьте строчку:
HISTCONTROL=ignoredups
#Не добавлять запись в историю команд, если команда начинается с пробела:
HISTCONTROL=ignorespace
#стираются все повторения, в том числе идущие не подряд, но в разной последовательности. (например, после cd..ls..cd..ls останется cd и ls)
HISTCONTROL=erasedups
# Чтобы история команд сохранялась сразу после ввода (а не во время закрытия терминала)
shopt -s histappend
PROMPT_COMMAND='history -a'
Последние строчки позволяют сохранять историю хоть в 100, одновременно открытых терминалах.
#Чтобы одинаковые команды не сохранялись в истории, добавьте строчку:
HISTCONTROL=ignoredups
#Не добавлять запись в историю команд, если команда начинается с пробела:
HISTCONTROL=ignorespace
#стираются все повторения, в том числе идущие не подряд, но в разной последовательности. (например, после cd..ls..cd..ls останется cd и ls)
HISTCONTROL=erasedups
# Чтобы история команд сохранялась сразу после ввода (а не во время закрытия терминала)
shopt -s histappend
PROMPT_COMMAND='history -a'
добавлю сюда еще HISTSIZE=n
где n — сколько строчек хранить в хистори.
где n — сколько строчек хранить в хистори.
Добавил в .bashrc. Как-то не так работает как я ожидал, если честно. Например набрал несколько команд в одном терминале. Без его закрытия открыл второй, все команды, набранные в первом видно в истории второго. Теперь набираю команды во втором. И вот уже этих команд в истории первого терминала не видно. Что я делаю не так? Или это фича?
Хм, откуда в history вот это:
17705 PROMPT_COMMAND='pwd>&8;kill -STOP $$'
17705 PROMPT_COMMAND='pwd>&8;kill -STOP $$'
Могу предположить, что это MC плюет командами в историю терминала. Проверьте. Если так, то это легко лечится.
Действительно, запускал mc. А как лечить?
Чтобы при установленном PROMPT_COMMAND=’history -a’ не записывалась в историю, все то, что подаёт на вход bash Midnight Commander, нужно добавить в HISTIGNORE:
Пробелы перед cd и PROMPT обязательны
Это mc при бегании по каталогам башу на вход подаёт команды “cd туда-же”, то есть запараллеливает текущий каталог на панели и текущий каталог в шелле.
export HISTIGNORE=”&:ls:[bf]g:exit: cd \”\`*: PROMPT_COMMAND=’*”
Пробелы перед cd и PROMPT обязательны
Это mc при бегании по каталогам башу на вход подаёт команды “cd туда-же”, то есть запараллеливает текущий каталог на панели и текущий каталог в шелле.
Del Судя по всему, с помощью этой команды mc узнаёт, какой текущий каталог, чтобы показывать приглашение. Так что лучше не убирать
В своем коментарии дал очень важное замечание: опции HISTCONTROL нужно писать через двоеточие в одной строке, иначе следующие опции затирают предыдущие.
HISTCONTROL содержит опции, разделённые двоеточием. Например:
HISTCONTROL=ignoredups:ignorespace
В вашем каждый следующий HISTCONTROL=… перетирает предыдущий
HISTCONTROL=ignoredups:ignorespace
В вашем каждый следующий HISTCONTROL=… перетирает предыдущий
И вообще, нужно писать HISTCONTROL="$HISTCONTROL: что-хотите-добавить"
А то HISTCONTROL по дефолту содержит, например, ignorespace, который позволяет писать пробел в начале команды, чтобы она не попадала в history. Судя по всему, ребята из этой ветки все перетёрли свой HISTCONTROL, трюк с пробелом перестал работать, в результате mc начал плеваться командами в history. Все команды mc начинаются с пробела, поэтому трюк с HISTIGNORE не нужен, достаточно лишь убедиться, что HISTCONTROL не перетирается.
А то HISTCONTROL по дефолту содержит, например, ignorespace, который позволяет писать пробел в начале команды, чтобы она не попадала в history. Судя по всему, ребята из этой ветки все перетёрли свой HISTCONTROL, трюк с пробелом перестал работать, в результате mc начал плеваться командами в history. Все команды mc начинаются с пробела, поэтому трюк с HISTIGNORE не нужен, достаточно лишь убедиться, что HISTCONTROL не перетирается.
Благодарю Вас за столь ценное замечание. Всегда казалось костылем решение проблемы с плеванием mc в history.
Курите маны, как говорится.
В свое оправдание могу сказать, что тема была о сохранении истории команд при работе одновременно в нескольких терминалах.( а также тем, что уже более 2-х лет на ).
Но вписав свои HISTCONTROL в конфиг, я ввел других в заблуждение. За это прощенья мне нет. Сейчас дам ссылку на Ваш комент всем основным участникам.
Курите маны, как говорится.
В свое оправдание могу сказать, что тема была о сохранении истории команд при работе одновременно в нескольких терминалах.( а также тем, что уже более 2-х лет на ).
Но вписав свои HISTCONTROL в конфиг, я ввел других в заблуждение. За это прощенья мне нет. Сейчас дам ссылку на Ваш комент всем основным участникам.
а у меня штатно открыто всегда 15
Если не секрет, зачем столько?
У меня обычно бывает в районе 4-х. В одном запущен сервер в sbt, в другом пушу пуллю гит, в третьем монга-консоль, в четвертом логи сервера, в пятом запущен другой sbt в котором гоняю утилиты, шестой для других надобностей, не связанных с текущей разработкой.
У меня просто система настроена на «полноэкранный режим» — всегда открыто 24 виртуальных десктопа, между которыми я переключаюсь по Alt-Fx и Alt-Shift-Fx. В каждом запущено одно приложение (обычно распахнутое на полный экран и без оформления окна — рамки и заголовка с кнопками закрыть/минимизировать). В 23-х десктопах приложения запускаются автоматически, при старте X-ов, один десктоп оставлен свободным на случай если понадобиться запускать какие-то редко используемые приложения.
Так вот, из этих 23-х у меня в нескольких запущены приложения — браузер, IM, почта, mc, mysql клиент, торрент, просмотр логов — а в остальных свободные терминалы, отсюда и такая цифра. Из этих 15 штук 5 используется для запуска ssh на сервера, пара для работы под рутом, etc, — в общем, по факту просто пустых терминалов для текущей работы остаётся всего штук 6.
В общем и целом это невероятно удобно. Сразу после загрузки машины я знаю, что по Alt-Shift-F1 у меня ssh на главный сервер, по Alt-Shift-F12 рутовая консоль, по Alt-F1 mc, по Alt-F2 клиент mysql, по Alt-F11 браузер, etc.
Так вот, из этих 23-х у меня в нескольких запущены приложения — браузер, IM, почта, mc, mysql клиент, торрент, просмотр логов — а в остальных свободные терминалы, отсюда и такая цифра. Из этих 15 штук 5 используется для запуска ssh на сервера, пара для работы под рутом, etc, — в общем, по факту просто пустых терминалов для текущей работы остаётся всего штук 6.
В общем и целом это невероятно удобно. Сразу после загрузки машины я знаю, что по Alt-Shift-F1 у меня ssh на главный сервер, по Alt-Shift-F12 рутовая консоль, по Alt-F1 mc, по Alt-F2 клиент mysql, по Alt-F11 браузер, etc.
а во-вторых стандартный подход с сохранением истории в файле не очень-то хорошо работает, когда одновременно открыто несколько терминалов
В интернете опять кто-то не знает про zsh.
Я то сам давно на zsh сижу, но те, кто еще не пересел, тоже удобств хотят. Вот и не выбрасываю свой bashrc , глядишь кому пригодится.
zsh тормозит. тчк
наврал он, в CentOS сохранило
Наш админ не растерялся www.commandlinefu.com/commands/browse/sort-by-votes Учитесь, есть где
А я знал, почти всегда использую пробел, чтобы не загромождать history дублирующими командами или которые больше не понадобятся.
Если нужно найти нужную команду которую делал, но не могу вспомнить точно всю команду, делаю history | grep *** например.
Если, кто-то стоит сзади, когда что-то правим, вечно скажет — нажми стрелку вверх для предыдущей команды, а у меня там ничего нету.
Если нужно найти нужную команду которую делал, но не могу вспомнить точно всю команду, делаю history | grep *** например.
Если, кто-то стоит сзади, когда что-то правим, вечно скажет — нажми стрелку вверх для предыдущей команды, а у меня там ничего нету.
В zsh если привязать вверх к
Единственное но: я не знаю, как в zsh одной настройкой убирать из истории команды, начинающиеся с пробела. У меня для этого есть функция zshaddhistory:
Насколько мне известна, такая настройка всё же существует.
history-beginning-search-backward
(или просто оставить функцию по‐умолчанию), то независимо от того, была ли помещена предыдущая команда в историю или нет, стрелка вверх её покажет. Но если команда в историю не была помещена, то любая следующая команда сделает невозможным вызов предыдущей при нажатии вверх. К примеру, <Space>echo I do not want this in history<CR><Up>
покажет <Space>echo I do not want this in history
, тогда как <Space>echo …<CR><CR><Up>
— уже нет (из‐за двух <CR>
).Единственное но: я не знаю, как в zsh одной настройкой убирать из истории команды, начинающиеся с пробела. У меня для этого есть функция zshaddhistory:
function zshaddhistory()
{
emulate -L zsh
if (( ${+_HISTLINE} )) ; then
print -sr -- "${_HISTLINE}"
unset _HISTLINE
elif (( 0x20==#1 )) ; then
return 1
else
print -sr -- "${1%%$'\n'}"
fi
fc -p
}
. Она же ответственна за подмену истории в некоторых случаях (именно для этого здесь находится первое условие с _HISTLINE
).Насколько мне известна, такая настройка всё же существует.
поробуйте Ctrl-R
Запуск последней команды под root.Главное – вовремя вспомнить, что там было.
Если рейтинг самых опасных команд был, можно было бы дать первое место.
Голосую за
<пробел>команда
Если включить опцию histverify, вы сможете увидеть развернутую комманду перед исполнением. Всячески рекомендую.
wiki.bash-hackers.org/internals/shell_options#histverify
wiki.bash-hackers.org/internals/shell_options#histverify
Я делаю !:p — модификатор «p» выводит команду полученную в результате history expansion, но не выполняет её. А в zsh можно просто после "!!" нажать tab.
Ну и все модификаторы, если кому интересно:
!:
& — repeat substitution
A — absolute path resolving symbolic links
Q — strip quotes
a — absolute path
e — leave only extension
g — globally apply s or &
h — head — strip trailing path element
l — lower case all words
p — print without executing
q — quote to escape further substitutions
r — root — strip suffix
s — substitute string
t — tail — strip directories
u — upper case all words
x — quote words, breaking on whitespace
!:
& — repeat substitution
A — absolute path resolving symbolic links
Q — strip quotes
a — absolute path
e — leave only extension
g — globally apply s or &
h — head — strip trailing path element
l — lower case all words
p — print without executing
q — quote to escape further substitutions
r — root — strip suffix
s — substitute string
t — tail — strip directories
u — upper case all words
x — quote words, breaking on whitespace
Хм, на консоле и написано, что вы вводили до этого. вы как раз же и используете "!!" что бы не было ошибки доступа, или у вас на столько короткая память?
Readline и zle (навигация в консоле) используют те же комбинации клавиш, что и emacs.
Ctrl-p — предыдущая комманда (previous)
Ctrl-n — следующая комманда (next)
Meta-backspace (meta это обычно alt) — удалить слово.
Meta-b — на слово назад (backward)
Meta-f — на слово вперед (forward)
И так далее, намного удобнее, чем использовать стрелки, если вы умеете печатать вслепую. www.bigsmoke.us/readline/shortcuts
Бонус:
Meta-. (dot) — последний аргумент предыдущей комманды, очень полезно если вы выполняете несколько комманд на одном и том же файле с длинным путем, например.
Кстати, на маке C-p и С-n работает во многих приложениях: поиск в омнибаре Chrom'а, редактирование в Skype, Alfred, etc.
Ctrl-p — предыдущая комманда (previous)
Ctrl-n — следующая комманда (next)
Meta-backspace (meta это обычно alt) — удалить слово.
Meta-b — на слово назад (backward)
Meta-f — на слово вперед (forward)
И так далее, намного удобнее, чем использовать стрелки, если вы умеете печатать вслепую. www.bigsmoke.us/readline/shortcuts
Бонус:
Meta-. (dot) — последний аргумент предыдущей комманды, очень полезно если вы выполняете несколько комманд на одном и том же файле с длинным путем, например.
Кстати, на маке C-p и С-n работает во многих приложениях: поиск в омнибаре Chrom'а, редактирование в Skype, Alfred, etc.
главное что бы вимер какой-нить в конфиг set -o vi не вставил ^_^
неужели ctr+p/n удобнее стрелочек?
А вы попробуйте. Как страшный сон забудете что такое стрелочки =)
Да, но только если вы печатаете десятипальцевым методом — не нужно отрывать руку от клавиатуры.
Да хоть полторапальцевым, разве лишние движения сопутствуют продуктивности?
В том и дело, что лишние движения — перенос руки к стрелкам. Ctrl нажимается краем ладони, P безымянным пальцем, — всё не отрывая рук от клавиатуры. Поэтому в Emacs (а стандартный режим bash именно оттуда) и vi(m) есть свои клавиши/комбинации для передвижения по строкам.
Ну так я про это и говорю =)
а минусуют те, кто даже не пробовал перейти полностью со стрелочек. Потом на них сложно вернуться. Num-pad тоже биндится на правую буквенную часть с какой-нить Win-key, и правая часть клавиатуры со своими стрелочками и цифрами вообще становится ненужной.
а минусуют те, кто даже не пробовал перейти полностью со стрелочек. Потом на них сложно вернуться. Num-pad тоже биндится на правую буквенную часть с какой-нить Win-key, и правая часть клавиатуры со своими стрелочками и цифрами вообще становится ненужной.
Свои комбинации там есть потому, что не на всех клавиатурах были клавиши со стрелками.
Там же написано, кроме Ctrl+p/n у вас руки лежат на клавиатуре и вы готовы делать также Ctrl+f/b, Alt+f/b, Ctrl+a/e, Ctrl+r и так далее. Ну и да, не нужно перемещать руки к стрелочкам, смешивая эти нажатия с вводом команды.
В zsh, если добавить опции
Пользуюсь для нахождения вариантов кодирования видео mencoder'ом — для компа, для ДВД-плеера, для телефона, для увеличения громкости и т.д.
bindkey '^P' history-beginning-search-backwardто можно не перебирать всю историю в поисках какой-то опции для команды, а ввести несколько первых букв и нажать Ctrl+P -> будут подставляться только те команды, что начинаются с этих букв.
bindkey '^N' history-beginning-search-forward
Пользуюсь для нахождения вариантов кодирования видео mencoder'ом — для компа, для ДВД-плеера, для телефона, для увеличения громкости и т.д.
Ctrl+A и Ctrl+E (начало/конец строки) не забудьте
К сожалению, некоторые полезные комбинации конфликтуют между собой. И это не проблема конкретных приложений, поскольку комбинации легко поменять, а конфликт идеологический — на уровне схем раскладок: readline, терминал, текстовый редактор.
Например, к вышеприведенному списку readlin'а можно добавить следующие комбинации:
C-a и C-e — переход в начало и конец строки, соответственно,
C-r и C-s — интерактивный поиск (isearch) в истории команд назад и вперед, соответственно (кстати, это намного полезный C-p и C-n, реально увеличивает производительность).
Но C-a по умолчанию используется в screen'е, а C-s блокирует вывод на терминал (а комплиментарная ей C-q разблокирует). Впрочем, в данном случае настройки скрина можно безболезненно изменить (поскольку это сравнительно новая программа, и ее комбинации не являются исторически значимыми ;) ), а блокировку терминала вообще выключить, поскольку она очень редко нужна.
Например, к вышеприведенному списку readlin'а можно добавить следующие комбинации:
C-a и C-e — переход в начало и конец строки, соответственно,
C-r и C-s — интерактивный поиск (isearch) в истории команд назад и вперед, соответственно (кстати, это намного полезный C-p и C-n, реально увеличивает производительность).
Но C-a по умолчанию используется в screen'е, а C-s блокирует вывод на терминал (а комплиментарная ей C-q разблокирует). Впрочем, в данном случае настройки скрина можно безболезненно изменить (поскольку это сравнительно новая программа, и ее комбинации не являются исторически значимыми ;) ), а блокировку терминала вообще выключить, поскольку она очень редко нужна.
Странно, что не упомянули brace expansion. Имхо, оно куда удобнее всяких сомнительных alt + esc.
Работает примерно так:
А через set -o vi можно переключиться в vi режим оболочки. Иногда это здорово экономит время, и редактор запускать не надо (:
Да и вообще, если доки почитать, там столько интересных вещей (:
Работает примерно так:
cp very_long_filename.{old,new}_ext
А через set -o vi можно переключиться в vi режим оболочки. Иногда это здорово экономит время, и редактор запускать не надо (:
Да и вообще, если доки почитать, там столько интересных вещей (:
Как ни странно, часто использую ALT+. Удобно, к примеру, в случае когда посмотрел содержимое файла с помощью cat/head/tail и решил его отредактировать. Всё пытаюсь найти аналог этой команды в режиме vi, только из-за неё не перехожу на него.
brace expansion — да, тоже полезно.
brace expansion — да, тоже полезно.
А еще многие не знают про поиск в истории команд: ctrl+r
Тут могло бы быть много слов радости, восторга и благодарности, но боюсь слова способные передать все мои чувства еще не придумали.
Правда? Тогда на всякий случай добавлю.
Для продолжения поиска нужно повторно нажимать ctrl+r.
т.е
git push origin
git push another
ctrl+r git push ctrl+r даст git push another
Для продолжения поиска нужно повторно нажимать ctrl+r.
т.е
git push origin
git push another
ctrl+r git push ctrl+r даст git push another
Поиск по ^R в баше (вернее, readline) сразу меркнет на фоне поиска «стрелочками» вверх-вниз, но не по всей истории, а с учетом набранных первых символов (т.е. набрав foo и стрелку вверх, я попаду не на просто предыдущую команду, а последнюю команду, начинающуюся на foo). В tcsh (для многих — шелл по умолчанию во FreeBSD) это работает сразу, «из коробки». Чтобы не чертыхаться на линуксах научить этому bash, достаточно дописать пару строк в ~/.inputrc:
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[A": history-search-backward
"\e[B": history-search-forward
Красота! Спасибо огромное!
Только это немного конфликтует со стандартным поведением стрелочек. Интересно, а можно ли прописать их вместе с каким-то модификатором? Например, ctrl? Я что-то и так пробовал и эдак — либо не работает, либо работает, но находит только один вариант, а дальше не работает.
Можно, конечно. Например, для случая с зажатым Ctrl коды клавиш «вверх» и «вниз» будут соответственно
Правда, я не очень понял, что вы имеете в виду под «немного конфликтует со стандартным поведением стрелочек». Если строка пустая, то перебинденные стрелочки будут работать как обычно. Или у вас какая-то более хитрая ситуация?
\e[1;5A
и \e[1;5B
. Для Alt — просто замените пятерку на тройку.Правда, я не очень понял, что вы имеете в виду под «немного конфликтует со стандартным поведением стрелочек». Если строка пустая, то перебинденные стрелочки будут работать как обычно. Или у вас какая-то более хитрая ситуация?
О, так заработало как надо. Только для меня почему-то эти escape последовательности так и остаются тёмным лесом. Пробовал делать по ману (man bash), но прописанное не работало.
Да, конфликтует в другой ситуации. Была строка, редактировал её. Решил просто вернуться к прошлой версии из истории, нажал стрелку вверх — а в ответ тишина. Просто потому что похожей строки в истории нет. Нужно курсор перемещать ближе к началу.
Но сейчас повесил на ctrl+стрелки, стало совсем хорошо.
Да, конфликтует в другой ситуации. Была строка, редактировал её. Решил просто вернуться к прошлой версии из истории, нажал стрелку вверх — а в ответ тишина. Просто потому что похожей строки в истории нет. Нужно курсор перемещать ближе к началу.
Но сейчас повесил на ctrl+стрелки, стало совсем хорошо.
Большое спасибо! Особенно за «cd -» — не знал.
Мало кто знает, что cd можно передать два аргумента, тогда это работает как replace. Например:
$ pwd
/home/me/project/beta/app/controllers
$ cd beta production
$ pwd
/home/me/project/production/app/controllers
$ pwd
/home/me/project/beta/app/controllers
$ cd beta production
$ pwd
/home/me/project/production/app/controllers
Еще pushd и popd
Добавьте еще
mkdir directoy && cd $_ # создание директории и переход в созданную директорию
sudo !!
Ну и что в этом хорошего? Выполнять команду от рута не видя её… Более того, если нечаянно выполнить такую команду из истории то по факту от рута нечаянно выполнится любая команда. И даже если посчитать по нажатию кнопок: Up Home s u d o пробел
это ровно столько же нажатий, сколько и на набор этой команды! В общем, вредная команда, зря Вы её на первое место в рейтинге поставили.Ну написано же: удобно, когда случайно забыл написать перед командой sudo.
Вместо возвращения на прошлую команду, перехода к началу строки, добавлением к ней sudo, нажатия Enter, быстрее написать
Чего опасного то? Не думаю, что введя команду и получив Permission denied, кто-то тут же может забыть что он только что ввёл =).
Вместо возвращения на прошлую команду, перехода к началу строки, добавлением к ней sudo, нажатия Enter, быстрее написать
sudo !! <Enter>
сразу же после получения Permission denied.Чего опасного то? Не думаю, что введя команду и получив Permission denied, кто-то тут же может забыть что он только что ввёл =).
⬆, <Ctrl-A>, sudo, Enter
тогда уж <Ctrl-P>, <Ctrl-A>, sudo,
а за ⬆ ещё тянуться надо =)
<space>
, Enterа за ⬆ ещё тянуться надо =)
А еще, если вы забывчивый, можно написать функцию (или скопировать из prezto)
# Inserts 'sudo ' at the beginning of the line.
function prepend-sudo {
if [[ "$BUFFER" != su(do|)\ * ]]; then
BUFFER=«sudo $BUFFER»
(( CURSOR += 5 ))
fi
}
zle -N prepend-sudo
bindkey "^X^S" prepend-sudo
Теперь вы можете добавлять sudo с C-x C-s.
Работает в ZSH, для BASH нужно немножко подшаманить.
# Inserts 'sudo ' at the beginning of the line.
function prepend-sudo {
if [[ "$BUFFER" != su(do|)\ * ]]; then
BUFFER=«sudo $BUFFER»
(( CURSOR += 5 ))
fi
}
zle -N prepend-sudo
bindkey "^X^S" prepend-sudo
Теперь вы можете добавлять sudo с C-x C-s.
Работает в ZSH, для BASH нужно немножко подшаманить.
Нажать Up и Home всяко быстрее, чем Shift 1 Shift 1. :)
да не скажите
за Up и Home далеко тянуться
быстрее вместо них Ctrl-P, Ctrl-A использовать не перемещая рук с основной позиции
за Up и Home далеко тянуться
быстрее вместо них Ctrl-P, Ctrl-A использовать не перемещая рук с основной позиции
Почему?
Только это всё равно менее быстро, чем
Shift+1
можно достать, не особо двигая кисти рук относительно основной позиции при слепой печати, а стрелочки и <Home>
можно нажать, не двигая кисть только на небольших (ноутбучных и им подобных) клавиатурах.Только это всё равно менее быстро, чем
<C-p>
, заменяющее у меня <Up>
; при том из‐за того, что <C-p>
(как и <Up>
) привязан к history-beginning-search-backward
нажимать <Home>
не нужно (в таком варианте позиция курсора при навигации по истории остаётся неизменной). Оболочка, конечно же, zsh.Честно говоря аргумент про нежелание двигать кисть к стрелкам я никогда не понимал. В конце концов я не секретарша, набиванием текста на скорость не занимаюсь. Я программист и админ, и большую часть времени трачу на то, чтобы подумать или изучить ситуацию. А на набор собственно кода или команд в консоли уходит незначительный процент моего времени.
И слепой набор здесь абсолютно не при чём — я им отлично владею больше 15-ти лет, а последние лет 7 у меня вообще была клавиатура без русских букв и стоящая под таким углом (Microsoft Natural Ergonomic 4000 с обратным наклоном) что и английские разглядеть было невозможно.
Поэтому мне ничуть не мешает, что большую часть времени (пока я думаю, просматриваю код, изучаю состояние сервера, etc.) у меня рука лежит на стрелках (навигация по коду) или рядом (Shift+PgUp/PgDown при анализе вывода предыдущих команд в консоли). А когда я принял решение что делать и перешёл к набору текста — на основной клавиатуре. Наоборот, очень удобно, что разные виды деятельности связаны с разными положениями рук.
И слепой набор здесь абсолютно не при чём — я им отлично владею больше 15-ти лет, а последние лет 7 у меня вообще была клавиатура без русских букв и стоящая под таким углом (Microsoft Natural Ergonomic 4000 с обратным наклоном) что и английские разглядеть было невозможно.
Поэтому мне ничуть не мешает, что большую часть времени (пока я думаю, просматриваю код, изучаю состояние сервера, etc.) у меня рука лежит на стрелках (навигация по коду) или рядом (Shift+PgUp/PgDown при анализе вывода предыдущих команд в консоли). А когда я принял решение что делать и перешёл к набору текста — на основной клавиатуре. Наоборот, очень удобно, что разные виды деятельности связаны с разными положениями рук.
Я тоже часто использую PageUp/PageDown для навигации по коду в режиме размышлений. Но это не тот случай: если вам надо дописать перед командой
Второй, более частый, use-case: недописанные цепочки. Т.е. я проверяю, действительно ли, к примеру,
Отмечу ещё, что чем лучше моё владение клавиатурой, тем менее мне нужны различного рода сокращения.
sudo
или что‐то в этом роде, то здесь другая логика: о необходимости изменений я узнаю немедленно по прекращению работы команды (т.е. либо она сразу завершается с ошибкой, либо я её убиваю по <C-c>
, видя неправильный результат) и, как правило, у меня так же немедленно возникает идея, как её исправить. Немедленно. Если идея уже есть, то руки не должны меня тормозить. Со стрелками они тормозят. Разумеется, предполагается, что я не убирая руки с основной позиции. Не вижу причин убирать, если я знаю, что мог что‐то сделать неправильно.Второй, более частый, use-case: недописанные цепочки. Т.е. я проверяю, действительно ли, к примеру,
grep
выдаёт, то, что мне нужно; затем проверяю следующую команду в цепочке (она уже придумана, но пишется только после проверки предыдущей). Идея всех команд в голове уже есть. Зачем себя тормозить?Отмечу ещё, что чем лучше моё владение клавиатурой, тем менее мне нужны различного рода сокращения.
В истории она сохраняется в развёрнутом виде, так что что попало выполнить не получится.
Могу себе представить невозможность вспомнить последнюю команду только в одному случае: по ssh куда-то зашли спустя время, но первой командой делать sudo!!! это само по себе невежество, а не проблема удобства этой команды.
Часто например aptitude update пишу без sudo, sudo!!! сильно облегчает жизнь.
Часто например aptitude update пишу без sudo, sudo!!! сильно облегчает жизнь.
Еще хорошая штука time. Пишешь time перед любой командой, после завершения получаешь время исполнения. Alt+P тоже отличная вещь. Вообще, все эти рейтинги весьма относительны…
Ctrl-A — вернуться в начало строки
Ctrl-E — перейти в конец строки
Ctrl-W — удалить слово перед курсором
Alt-D — удалить слово после курсора
Ctrl-U — удалить всю строку слева от курсора.
Ctrl-R — поиск по истории команд
Из самой статьи разве что reset узнал:)
Ctrl-E — перейти в конец строки
Ctrl-W — удалить слово перед курсором
Alt-D — удалить слово после курсора
Ctrl-U — удалить всю строку слева от курсора.
Ctrl-R — поиск по истории команд
Из самой статьи разве что reset узнал:)
Быстрый
cd
в любой подкаталог заданных:CDPATH=:..:~:~/projects
Можно пояснить, как пользоваться? Часто приходится прыгать по поддиректориям с либами.
Смотрел push/pop и различные аналоги: github.com/joelthelion/autojump, пока не приучил себя пользоваться.
Смотрел push/pop и различные аналоги: github.com/joelthelion/autojump, пока не приучил себя пользоваться.
узнать 10 наиболее используемых вами команд
history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn |head -n 10
git побеждает с большим отрывом. =)
Жутко бесит, когда помнишь, что набирал команду недавно, начинаешь скроллить, а там по 10 раз повторяются mc/reset/apt-get update. Настроил «убирать дубликаты» — в истории остаётся только самое последнее применение команды, остальные удаляются.
В zsh
В zsh
setopt HIST_IGNORE_ALL_DUPS
А у меня привычка смотреть вывод top / htop после каждого подключения к машине. Думал, нас много, удивился что в рейтинге ее нет.
У меня такая привычка сформировалась по очень простой причине: простаивающее соединение рвёт провайдер, а запуск чего-то, что постояно гоняло трафик, решало эту проблему, теперь уже машинально запускаю, даже если исходная проблема неактуальна :)
Родные, подскажите как в консоли поправить время в тегах фотографий. А то с отпуска приехал и осознал, что забыл в камере перевести время на 3 часа назад… И вроде бы, какая разница? — А вот что-то гложет меня, не могу успокоится. Фоток много…
На море

Считаю, что в заголовке статьи (или хотя бы в ее тексте) нужно упомянуть, что все это относится к оболочке bash (я вот пользуюсь fish и многое здесь у меня не сработает).
Что сделать, чтоб заработало 'CTRL+X E'?
Попробуйте нажимать с зажатым Shift'ом. Зажимаем Shift+Ctrl, нажимаем X (не зажимая), нажимаем E. Работает в bash и zsh из-под коробки.
Возможно, у автора поста ошибка. Правильная комбинация не C-x e, а C-x C-e (то есть жать e, не отпуская Ctrl). А может, просто настройки баша по умолчанию различаются в разных дистрибутивах.
По иронии судьбы знал только первое место
И спасибо за space команда. Я историю до этого дня чистил.
Хм, практически всё видел и использую.
Здесь много команд с рейтингом: www.commandlinefu.com/commands/browse
Подобное тому, что у ali_aliev (функция в ~/.bashrc): mkcd() { mkdir -p "$@" && cd $_; }
Здесь много команд с рейтингом: www.commandlinefu.com/commands/browse
Подобное тому, что у ali_aliev (функция в ~/.bashrc): mkcd() { mkdir -p "$@" && cd $_; }
Еще бывают ситуации, когда поставил, к примеру, компилировать какую-то здоровенную программу, после чего понимаешь, что это займет очень много времени. Вместо того, чтобы открывать новую консоль или сеанс, можно смело нажать ctrl+z и написать в консоли bg — это переведет исполняющуюся программу в фоновый режим. Список задач можно посмотреть командой jobs.
ну уйдет оно в bg, а гадить-то на тот же экран продолжит.
Тогда уж и про disown расскажите!
Отличная утилита, узнал бы я о ней на пару лет раньше, сэкономил бы массу времени.
Опишу пример использования на всякий случай. Запустили вы в терминале некую команду scp, mv, rsync и т.д., она выполняется пока открыт терминал, если терминал закроется выполнение команды прекратится. В этом случае нам на помощь приходит команда disown, делаем следующее: запущенный процесс останавливаем Ctrl+Z и запускаем его в бэкграунде bg, далее пишем disown, процесс останется выполняться в фоне, без привязки к вашей текущей сессии, терминал можно закрывать. Команда бывает очень полезной если вы забыли запустить screen или tmux.
Опишу пример использования на всякий случай. Запустили вы в терминале некую команду scp, mv, rsync и т.д., она выполняется пока открыт терминал, если терминал закроется выполнение команды прекратится. В этом случае нам на помощь приходит команда disown, делаем следующее: запущенный процесс останавливаем Ctrl+Z и запускаем его в бэкграунде bg, далее пишем disown, процесс останется выполняться в фоне, без привязки к вашей текущей сессии, терминал можно закрывать. Команда бывает очень полезной если вы забыли запустить screen или tmux.
Когда пишу длинную и потенциально деструктивную команду, всегда ставлю # в начале, чтобы не наломать дров, нечаянно нажав ентер. Дописав и проверив, # убираю.
Особенно часто спасает, когда команду копи-пастишь откуда-то — можно легко скопировать невидимый символ возврата каретки…
Особенно часто спасает, когда команду копи-пастишь откуда-то — можно легко скопировать невидимый символ возврата каретки…
Можно нарваться, если копипастятся несколько строк. Первая-то закомментарится, а следующие выполнятся. Особенно весело будет, если скопированы две строки вида:
export TEST=/tmp/some_path
rm -rf $TEST/*
Отличный пример :)
Для пользователей zsh могу предложить для копирования и вставки использовать widget’ы:
При желании можно модифицировать widget’ы, чтобы все строки комментировались автоматически при наличии в начале строки
function _-insert-primary()
{
emulate -L zsh
LBUFFER="${LBUFFER}$(xclip -o)"
}
function _-insert-clip()
{
emulate -L zsh
LBUFFER="${LBUFFER}$(xclip -o -sel clip)"
}
zle -N insert-primary _-insert-primary
zle -N insert-clip _-insert-clip
bindkey -M evi "\C-r*" "insert-primary"
bindkey -M evi "\C-r+" "insert-clip"
. С ними вставка будет на <C-r>*
(мышиный буфер) и <C-r>+
(обычный буфер) (как в vim). Комментироваться указанным способом будет всё равно одна строка, но есть важное отличие: при вставке таким способом команды не исполняются независимо от наличия или отсутствия в них каких‐либо символов, включая символ новой строки.При желании можно модифицировать widget’ы, чтобы все строки комментировались автоматически при наличии в начале строки
#
, но раскомментировать их потом будет не слишком удобно (если только не написать ещё один widget для раскомментирования).можно еще screen юзать если нужно такое делать часто или автоматически.
Ctrl+R, на мой взгляд, может побороться за одно из первых мест.
Сколько людей мучается, набирая «history | grep labuda».
Сколько людей мучается, набирая «history | grep labuda».
Alt + BackSpace
— удалить слово в строке до разделителяНе знаю, подходит ли для этой темы, но вот что пригодилось мне:
python -m smtpd -n -c DebuggingServer localhost:1025 #Отладочный smtp сервер
cat <whatever> | python -mjson.tool # печатает отформатированный json
ls music | sort --random-sort #перемешивание
bash -x #будет показана отладочная информация выполняющегося скрипти
xargs умеет параллелить процессы (-P / --max-procs):
Или используйте GNU Parallel
time echo {1..5} | xargs -n 1 -P 5 sleep
real 0m5.007s
user 0m0.004s
sys 0m0.004s
time echo {1..5} | xargs -n 1 sleep
real 0m15.010s
user 0m0.000s
sys 0m0.004s
Или используйте GNU Parallel
Полезный хоткей в баше чтобы сделать из строки типа ls * строку, где будет вместо * будет перечислено то, что подставится при выполнении:
Удобно, когда нужно открыть каталог со сбившейся кодировкой. Пишем cd *, жмём этот хоткей, удаляем лишние каталоги, остаётся один, нужный нам. Еще можно использовать для того, чтобы удалить все файлы в каталоге, кроме одного.
В zsh это делается просто нажатием на [tab].
[esc] - *
Удобно, когда нужно открыть каталог со сбившейся кодировкой. Пишем cd *, жмём этот хоткей, удаляем лишние каталоги, остаётся один, нужный нам. Еще можно использовать для того, чтобы удалить все файлы в каталоге, кроме одного.
В zsh это делается просто нажатием на [tab].
Какое прикольное имя сайта: commandlinefu — его явно русскоязычный любитель графического интерфейса регистрировал! :) (Подсказка: commandline — фу!)
Я сам, лично, ничего плохого про командную строку сказать не хотел! Сам с удовольствием пользуюсь и считаю, что многие вещи в ней делаются гораздо быстрее и удобнее. ПРОСТО увидел это в названии сайта и решил, что это прикольно и кому-то даже настроение слегка поднимет. А тут зачем-то минусы пошли…
mtr — вещь, не знал про неё.
Для Python 2.x:
Для Python 3.x:
python -m SimpleHTTPServer [PORT]
Для Python 3.x:
python -m http.server [PORT]
cd -
вот не знал про такую фишку, часто нужно в итоге пользуюсь историей команд, но так явно удобней.
Для Ruby
alias server='ruby -run -e httpd -- -p 5000 .'
!!$
— вставить последний аргумент из предыдущей коммандыПочти всё знал, но особое спасибо за
^foo^bar
— гениально!Когда-то я узнал про history expansion и event designators, и уже не смог остановиться. Использовал !$ вместо Alt+., потому что до недавнего времени вообще не знал про такую комбинацию. Кроме !!, ещё очень часто использую !?substring — ищет в истории команду с заданной подстрокой. Иногда и модификаторами балуюсь. Что может быть проще, чем !?file.txt?:s//file.mp3 ?:)
Так это же стандартное перенаправление:
А то, что команду перенаправления можно использовать без указания источника, знают не все, т.к. в учебных пособиях про это обычно не пишут.
Кстати, вместо
>
с очисткой файла, >>
— без. Основы, можно сказать. А то, что команду перенаправления можно использовать без указания источника, знают не все, т.к. в учебных пособиях про это обычно не пишут.
Кстати, вместо
touch a.txt
вполне можно использовать > a.txt
Не шутите так.
touch
не изменяет содержимое существующего файла, а >
уничтожит текущее содержимое.Как замена touch подойдёт
>> a.txt
.Очень удобно глянуть календарик в консоли этой командой:
cal
А как же без этой команды:
yes "I love Habr"
Недостаточно кармы, поэтому просто спасибо )
к сожалению, почти все эти команды характерны для баша, о чём даже не упоминается в статье. Я исторически поклонник tcsh и у меня это не работает.
Одна из моих любимых команд:
sudo netstat -luntp
показывает все открытые порты с использующими их приложениями
Одна из моих любимых команд:
sudo netstat -luntp
показывает все открытые порты с использующими их приложениями
И для полноты картины:
netstat -s
netstat -ap | grep ssh
netstat -c
netstat (как и ifconfig, и route) работают не совсем корректно в наше время — когда для настройки сети используются продвинутые фичи ядра через iproute2 — вот прикольный обзор на эту тему 5-ти летней давности: ifconfig sucks.
помню была такая фишка в tcsh — вводишь название команды, а потом стрелочкой выбираешь все предыдущие значения которые запускал этой командой, не знаете как это называется? очень не хватает
zsh также поддерживает такую возможность.
Вот, кстати, про эту возможность есть вопрос.
Я с удовольствием пользуюсь этой возможностью на удалённых серверах, но на локальном хосте она у меня никогда не работает (тупо берёт последнюю команду из истории).
Конфиг, естественно одинаковый и там и там (на основе oh-my-zsh). Почему оно может не работать не понимаю.
Я с удовольствием пользуюсь этой возможностью на удалённых серверах, но на локальном хосте она у меня никогда не работает (тупо берёт последнюю команду из истории).
Конфиг, естественно одинаковый и там и там (на основе oh-my-zsh). Почему оно может не работать не понимаю.
К сожалению, не могу помочь. Я настраивал конфиг сам и давно. Сейчас просто таскаю его, когда перехожу на другую машину. Поэтому уже подзабыл, что именно я правил.
А глобальный конфиг ( то есть /etc/zshrc ) не различается?
Такое происходит, если в конфиге использовались escape‐последовательности, выдаваемые стрелочками, напрямую (или с использованием zkbd), а не получались тем же способом, каким их получает zsh.
Я предполагаю, что для получения используется terminfo. Во всяком случае,
Я предполагаю, что для получения используется terminfo. Во всяком случае,
echo $terminfo[kcuu1]
выдаёт то, что выдают стрелочки (но у меня — не всегда: при использовании команды внутри Vim всё правильно, а внутри zsh — нет). Соответствие названий записей клавишам можно узнать в man terminfo
.Почему была, она и сейчас есть, это команды history-search-backward и history-search-forward. Во FreeBSD они забиндены на стрелочки по умолчанию, даже ничего настраивать не надо:
Я там немного выше поделился рецептом, как такой же поиск по хистори прикрутить к bash.
bindkey -k up history-search-backward bindkey -k down history-search-forward
Я там немного выше поделился рецептом, как такой же поиск по хистори прикрутить к bash.
netstat -plunt запоминается легче :)
Замечательный скрипт для простой навигации. Можно ввести часть пути — и вы попадете в нужную директорию https://github.com/rupa/z
Блин из комментов нужно делать выжимку во 2 статью. Правда главное так не зациклиться
Недавно узнал как гуманно останавливать залипшую SSH сессию (например. в случае проблем с сетью) когда SSH клиент не реагирует на команды:
Есть ещё несколько тильда-комманд для ssh — справку можно посмотреть по
<Enter>~.
— закрывает SSH клиент и возвращает в консоль.Есть ещё несколько тильда-комманд для ssh — справку можно посмотреть по
<Enter>~?
Если уж речь уже и просто о полезных утилитках, то недавно открыл для себя
pstree
На рабочем маке так себе, процессов уж очень много.
А вот на серверах картинка очень красивая

pstree
На рабочем маке так себе, процессов уж очень много.
А вот на серверах картинка очень красивая

Not safe for work!!!
sudo killall5
sudo killall5
Применять изменённые правила файрвола лучше не через iptables-restore, а через iptables-apply — особенно на удалённом сервере — так меньше шанс остаться после этого без доступа к серверу.
dtach -A /tmp/session.dt bash
Ctrl + \
— detachЕсть удобная команда 'dtach', которую иногда удобнее использовать вместо 'disown'. Она перенаправляет stdin/stdout в unix-сокет, к которому позже можно подключиться. На сокет можно настроить права на запись и чтение и несколько пользователей могут работать с сокетом одновременно. Очень удобно, если нужно, например, транслировать группе людей окно терминала. Есть патч, позволяющий работать с сокетом, доступным только для чтения.
а мне вот такое помогает часто из консоли копировать файлы
scp -P 2299 file user_name@remote_server:~/ #скопировать на удалённый компьютер
scp -P 2299 user_name@remote_server:~/file.txt ~/ # скопировать с удалённого компьютер в домашнюю директорию
-P порт
scp -P 2299 file user_name@remote_server:~/ #скопировать на удалённый компьютер
scp -P 2299 user_name@remote_server:~/file.txt ~/ # скопировать с удалённого компьютер в домашнюю директорию
-P порт
немножко в сторону, все-таки сторонняя утилита, но очень рекомендую ncdu
быстро строит древо использования места на диске
быстро строит древо использования места на диске
Нашел по этой же тематике еще одну интересную статью — www.opennet.ru/base/sys/bash_tips.txt.html
И всё это отвратно работает в fish. С другой стороны, в fish'е оно все и не нужно.
Я бы так не сказал. Каждый раз, когда я смотрю fish мне там чего‐то не хватает. То
$var:a:h
(полное имя каталога, в котором находится файл из данной переменной), то математики (обёртка над bc — это совершенно не то: попробуйте поработать с шестнадцатиричными цифрами), то автодополнения (оно есть для гораздо меньшего числа команд, нежели в bash или zsh), то нормального разбиения на аргументы ((command)
разобьёт по новым строкам, если вы не станете трогать IFS, причём в документации об IFS не написано ничего (единственное упоминание — в документации read
)). Короче, моё впечатление:- Zsh может всё, что делает fish.
- Кроме fish autosuggestions. Zsh их тоже теоретически может (есть даже набор скриптов для получения fish‐подобных подсказок), но только используя набор хаков.
- И подсветки. Она есть, она как бы работает, но для неё нет нормального парсера. Людям надо было писать его на perl или python, а не на zsh. Сейчас можно допилить pygments и взять мой zpython, но это более новый проект, чем zsh-syntax-highlighting.
- Кроме вышеуказанных двух пунктов в fish нет ничего хорошего. Привычные по zsh возможности для написания скриптов в fish либо отсутствуют полностью, либо требуют очень много текста.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Десятка лучших консольных команд