Як швидко зберігати та отримувати доступ до часто використовуваних команд?


37

У мене є багато команд, які мені зазвичай потрібно виконувати, найчастіше з найменшими варіаціями.

Зараз я зберігаю їх усіх .bash_historyі використовую CTRL- Rдля доступу до них, але мені цікаво, чи є кращий спосіб. Що я шукаю:

  • Легко додати нову команду
  • Легкий пошук і повторне виконання потрібної команди
  • Уникайте небажаних команд у пропозиціях

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


7
для щоденних команд, aliasможливо, корисніше. напр. alias gfc="git fetch origin"
номер5

Відповіді:


20

Я вважаю дуже корисними наступні команди для читання рядків

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щоб виконати.


1
+1 для цього я роблю те саме, хоча я просто прив’язую їх до клавіш зі стрілками вгору та вниз (без модифікатора CTRL), що працює для мене. Якщо ви хочете зробити так само, потрібні вам рядки "\e[B": history-search-forwardта"\e[A": history-search-backward
Саймон Уітакер

Також врахуйте зростання HISTFILESIZEта / або HISTSIZE(лише zsh підтримує HISTSIZE, bash підтримує і те й інше), щоб переконатися, що буфер достатньо великий. ТАК питання bash HISTSIZE vs. HISTFILESIZE? може засвітити далі.
Адам Кац

56

Ще одна порада: я іноді використовую коментарі для закладки / тегу команди:

my_command #bookmark

потім:

[ctrl-r]#bookmark

люблю! - приємно.
Грег

17
Баштаги! Геніальність. :-)
Саймон Уітакер

Дуже хороша! Я також буду використовувати це для свого mysql-cli :)
Конерак

Це чудово! На жаль, zshell не сприймає # як початок коментаря в інтерактивному сеансі. Знаєте подібний трюк для цього?
Натан Лонг

1
@NathanLong : $_bookmark. Можна стверджувати, що це жахливий хак, що використовує той факт, що неіснуючі змінні розширюються ні до чого, але це, безумовно, працює, із застереженням, що пробіли заборонені (замість цього використовується _).
kampu

7

Хоча я маю обмежений обсяг, я хочу зазначити цих двох заповнювачів розширення:

!! 

є розширенням заповнювача для останньої команди. Корисно, якщо ви забули поставити sudoперед командою.

!$ 

повторює останній параметр. Корисно, якщо ви хочете повторити іншу команду зa/very/long/path/name/you/do/not/want/to/type/again


Так, чудова порада ... коли б тільки я згадав їх використовувати :)
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

+1 в першу чергу для згадування HISTCONTROL=ignorespace, що важливо для того, щоб не захаращувати історію.
quodlibetor

2

Серед усіх інших відповідей, що стосуються історії.

я встановив

HISTFILESIZE=2024
HISTSIZE=1024

в ~ / .bash_profile

На додаток до інших коментарів про: історію

Ще одна корисна функція ...

Початок згадування історії з

!first few letters<ESC>Ctrl-E

згадає останню команду, яка почалася з перших кількох літер

наприклад:

!find<ESC>Ctrl-E

Ви не згадали, чи використовуєте ви чи лише графічний інтерфейс чи командний рядок. Якщо ви користуєтесь графічним інтерфейсом, ви можете скористатися одним із стійких менеджерів буфера обміну, щоб скопіювати / вставити загальновживані команди, користувальницькі файли, паролі, URL-адреси тощо.


Нічого собі, !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 є послідовністю "стоп", а не (безпосередньо) доступною для пошуку вперед.
enzotib

У таких випадках пошук вперед може бути перероблений на щось інше, ніж <kbd> Ctrl-S </kbd>.
Євгеній


0

На додаток до хороших відповідей вище, якщо ви випадково використовуєте gui на основі 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 }

для замінника кілла.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.