Как быстро сохранить и получить доступ к часто используемым командам?

37

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

Прямо сейчас я храню их все .bash_historyи использую CTRL- Rчтобы получить к ним доступ, но мне интересно, есть ли лучший способ. Что я ищу:

  • Легко добавить новую команду
  • Простой поиск и повторное выполнение требуемой команды
  • Избегайте нежелательных команд в предложениях

К сожалению, bash_history не настолько силен , на третьем спросе: если я немного cdи lsон заполняет файл история быстро. Недавно я узнал о HIST_SIZEтом, что вы можете настроить историю, чтобы избежать дублирования или определенных команд, но прежде чем настраивать все это, я хотел убедиться, что это лучший способ.

Konerak
источник
7
для повседневных команд, aliasможет быть, более полезным. например. alias gfc="git fetch origin"
№5

Ответы:

20

Я считаю очень полезными следующие команды readline

history-search-backward,
history-search-forward

(имейте в виду reverse-search-history, что они отличаются от обычных forward-search-history, привязаны к Ctrl- R, Ctrl- S).

У меня есть эти команды, связанные с Ctrl- Upи Ctrl- Downпомещая следующие строки ~/.inputrc:

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

Как они работают: напишите несколько символов начала команды, нажмите Ctrl- Upи будет показана следующая более старая команда, начинающаяся с этого префикса, нажмите еще раз, чтобы увидеть следующую, и так далее. Если вы удовлетворены, после возможного изменения команды нажмите Enterдля выполнения.

enzotib
источник
1
+1 для этого я делаю то же самое, хотя я просто привязал их к клавишам со стрелками вверх и вниз (без модификатора CTRL), что мне подходит. Если вы хотите сделать то же самое, что вам нужно, "\e[B": history-search-forwardи"\e[A": history-search-backward
Саймон Уитакер
Также рассмотрите возможность увеличения HISTFILESIZEи / или HISTSIZE(zsh поддерживает только HISTSIZE, bash поддерживает оба), чтобы гарантировать, что ваш буфер достаточно велик. ТАК вопрос bash HISTSIZE против HISTFILESIZE? можно осветить дальше.
Адам Кац
56

Другой совет: я иногда использую комментарии, чтобы пометить / пометить команду:

my_command #bookmark

тогда:

[ctrl-r]#bookmark
Крис Дж
источник
люблю это! - приятно.
Грег
17
Bashtags! Genius. :-)
Саймон Уитакер
Очень хорошо! Я собираюсь использовать это для моего mysql-cli тоже :)
Konerak
Это отлично! К сожалению, zshell не рассматривает # как начало комментария в интерактивном сеансе. Знаешь подобный трюк для этого?
Натан Лонг
1
@NathanLong: $_bookmark. Можно утверждать, что это ужасный хак, использующий тот факт, что несуществующие переменные расширяются до нуля, но это, безусловно, работает, с оговоркой, что пробелы не разрешены (используйте вместо них _).
Кампу
7

Несмотря на очень ограниченную область применения, я хотел бы указать на эти два заполнителя расширения:

!! 

является расширением для последней команды. Полезно, если вы забыли поставить sudoперед командой.

!$ 

повторяет последний параметр. Полезно, если вы хотите повторить другую команду сa/very/long/path/name/you/do/not/want/to/type/again

chiborg
источник
Да, отличный совет ... если бы я только запомнил их использование :)
Jeach
6

Используйте псевдоним

alias отличный инструмент для этого.

  • Вы можете легко объявить его в командной строке для использования во время текущего сеанса оболочки.
  • Если вы будете использовать его в будущем, вы можете добавить его в конфигурацию вашей оболочки.

Когда вы используете псевдоним, он точно такой же, как если бы вы его печатали, поэтому он довольно гибкий. Например, вы можете использовать его с трубами:

alias findfoo="grep 'foo'"
echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo # Does your custom grep

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

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches
Натан Лонг
источник
5

Я создаю минимальные сценарии оболочки для своих частых команд и даю им короткие имена. Все они хранятся в одном месте, которое добавляется вPATH .

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

Дэвид Грелшайд
источник
3
Если вы просто хотите передать аргументы, рассмотрите определение функций вместо этого. Если вам нужны полные сценарии, это хорошее решение :)
Konerak
@ Konerak Я должен попробовать это. Бьюсь об заклад, я обычно просто создаю сценарий, но определение функций будет намного чище.
ixtmixilix
4

Я поддерживаю копию .bash_history в Git . Чтобы упростить это, я установил

# don't put duplicate lines in the history
# don't save commands which start with a space
HISTCONTROL=ignoredups:erasedups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

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

# Ensure a single space at the end of each line to easier add more parameters
sed -i -e 's/ *$/ /' "~/.bash_history"

sort --unique --output="~/.bash_history" "~/.bash_history"

который я запускаю, прежде чем добавлять строки в git gui. Поскольку файл истории изменяется с каждой командой, у меня также есть специальная команда для обновления этого конкретного хранилища:

git stash && git pull && git stash pop
l0b0
источник
+1 в первую очередь за упоминание HISTCONTROL=ignorespace, что иногда важно, чтобы не загромождать историю.
quodlibetor
2

Среди всех других ответов здесь участвует история.

Я поставил

HISTFILESIZE=2024
HISTSIZE=1024

в ~ / .bash_profile

В дополнение к другим комментариям re: history

Еще одна полезная функция ...

Начиная вспомнить историю с

!first few letters<ESC>Ctrl-E

Вспомним последнюю команду, которая началась с первых букв

например:

!find<ESC>Ctrl-E

Вы не упомянули, используете ли вы графический интерфейс или только командную строку. Если вы используете графический интерфейс, вы можете использовать один из постоянных менеджеров буфера обмена для копирования / вставки часто используемых команд, идентификаторов пользователей, паролей, URL-адресов и т. Д.

BSD
источник
Вау, !find<ESC>CTRL-Eработает, но я сомневаюсь, что смогу вспомнить это завтра. Что это за ESC CTRL-E?
Конерак
просто привязка к расширенному ключу
BSD
0

Умение использовать Ctrl-Rи Ctrl-Sпозволяет легко искать команды, которые вы ищете в истории, и вы уже нашли переменную среды HISTCONTROL, чтобы игнорировать дубликаты и изменить сайт файла истории bash.

Я обычно делаю много, Ctrl-Rа затем Ctrl-Eизменяю некоторые параметры, если я пропустил найденную команду, нажав Ctrl-Rслишком много раз, Ctrl-Sчтобы спасти.

Евгений
источник
2
Часто tty настраивается таким образом, что Ctrl-S является последовательностью «остановки» и недоступен (напрямую) для прямого поиска.
энзотиб
В таких случаях прямой поиск может быть переназначен на что-то, кроме <kbd> Ctrl-S </ kbd>.
Евгений
0

Я всегда предпочитаю хранить последние использованные команды и их вывод.

script filename
Баласвами Ваддеман
источник
0

В дополнение к хорошим ответам выше, если вы используете графический интерфейс, основанный на kde или gnome, то AutoKey может быть удивительно полезен.

https://code.google.com/p/autokey/

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

Он также поддерживает скрипты, написанные на python, которые можно заставить делать почти все, если вы знаете python. Я еще не знаю Python, но у меня уже есть несколько очень простых скриптов, чтобы делать аккуратные вещи.

Кажется, что все идет от вашей клавиатуры, поэтому он работает с любым приложением, которое принимает ввод с клавиатуры - и с вашим рабочим столом, сам.

Он имеет множество опций, управляющих тем, как и где эти вещи активируются, поэтому вы можете иметь некоторые, которые работают только в вашей консоли, а другие - только в другом окне. Вы также можете настроить запуск фраз, как только наберете строку, которая их вызывает, или подождите, пока вы не дадите им ОК.

Джо
источник
0

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

function ff() { find . -iname "*$**" }

это работает как locate (я использую его, когда по какой-то причине db недоступен). Или

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

для замены killall.

Rkj
источник
0

В дополнение к использованию Cntl-Rдля просмотра в .bash_history, у меня также есть файл README в ~/developкаталоге, куда я помещаю длинные команды, например, для git/ svn, так что я могу вернуться к ним позже, когда мне это понадобится. Точно так же я планирую иметь ~/install/READMEфайл для размещения всех общих имен пакетов, которые я обычно устанавливаю после установки новой версии Linux / Ubuntu. Таким образом, идея заключается в том, чтобы иметь файл README внутри каждого каталога, например, Video, Audio, ... и вставлять в них общие команды / советы, которые вам, возможно, понадобится узнать позже.

Amr
источник