Jak szybko przechowywać i uzyskiwać dostęp do często używanych poleceń?

37

Mam wiele poleceń, które muszę rutynowo wykonywać, często z najmniejszymi zmianami.

Teraz przechowuję je wszystkie .bash_historyi używam CTRL- Raby uzyskać do nich dostęp, ale zastanawiam się, czy jest lepszy sposób. Czego szukam:

  • Łatwo dodać nowe polecenie
  • Łatwe wyszukiwanie i ponowne wykonanie żądanego polecenia
  • Unikaj niepożądanych poleceń w sugestiach

Niestety, bash_history nie jest tak silny na trzecie żądanie: jeśli zrobię kilka cdi lsszybko zapełni plik historii. Niedawno się dowiedziałem HIST_SIZEi że możesz skonfigurować historię, aby uniknąć duplikatów lub niektórych poleceń, ale przed skonfigurowaniem tego wszystkiego chciałem się upewnić, że to najlepszy sposób.

Konerak
źródło
7
do codziennych poleceń, aliasmoże bardziej przydatne. na przykład. alias gfc="git fetch origin"
numer

Odpowiedzi:

20

Uważam za bardzo przydatne następujące polecenia readline

history-search-backward,
history-search-forward

(należy pamiętać, że są różni się od zwykłej reverse-search-history, forward-search-history, przywiązany do Ctrl- R, Ctrl- S).

Mam te polecenia dla Ctrl- Upi Ctrl- Downumieszczenie poniższe linie do ~/.inputrc:

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

Jak działają: napisz kilka znaków na początku polecenia, naciśnij Ctrl- Upa zostanie wyświetlone następne starsze polecenie rozpoczynające się od tego prefiksu, naciśnij ponownie, aby zobaczyć następne i tak dalej. Jeśli jesteś zadowolony, po ewentualnej modyfikacji polecenia, naciśnij, Enteraby wykonać.

enzotib
źródło
1
+1 za to, robię to samo, chociaż po prostu mam je przypisane do klawiszy strzałek w górę i strzałek w dół (bez modyfikatora CTRL), co działa dla mnie. Jeśli chcesz zrobić to samo linie są potrzebne "\e[B": history-search-forwardi"\e[A": history-search-backward
Simon Whitaker
Rozważ także rozwijanie HISTFILESIZEi / lub HISTSIZE(tylko zsh obsługuje HISTSIZEbash, oba obsługują oba), aby upewnić się, że bufor jest wystarczająco duży. Pytanie SO bash HISTSIZE vs. HISTFILESIZE? może oświetlać dalej.
Adam Katz
56

Kolejna wskazówka: czasami używam komentarzy do dodawania zakładek / oznaczania polecenia:

my_command #bookmark

następnie:

[ctrl-r]#bookmark
Chris J
źródło
uwielbiam to!
Greg,
17
Basztagi! Geniusz. :-)
Simon Whitaker,
Bardzo dobrze!
Użyję
To wspaniale! Niestety, Zshell nie traktuje # jako początku komentarza w interaktywnej sesji. Znasz podobną sztuczkę?
Nathan Long
1
@NathanLong: $_bookmark. Można argumentować, że jest to okropny hack wykorzystujący fakt, że nieistniejące zmienne rozwijają się do zera, ale na pewno działa, z zastrzeżeniem, że spacje są niedozwolone (zamiast tego należy użyć _).
kampu
7

Mimo bardzo ograniczonego zakresu chciałbym zwrócić uwagę na te dwa symbole zastępcze rozszerzenia:

!! 

jest rozszerzeniem zastępczym dla ostatniego polecenia. Przydatne, jeśli zapomniałeś wstawić sudoprzed poleceniem.

!$ 

powtarza ostatni parametr. Przydatne, jeśli chcesz powtórzyć inne polecenie za pomocąa/very/long/path/name/you/do/not/want/to/type/again

Chiborg
źródło
Tak, świetna wskazówka ... gdybym tylko pamiętał, aby z nich korzystać :)
Jeach,
6

Użyj „aliasu”

alias jest do tego doskonałym narzędziem.

  • Możesz łatwo zadeklarować jeden w wierszu poleceń, który będzie używany podczas bieżącej sesji powłoki.
  • Jeśli będziesz go używać w przyszłości, możesz dodać go do konfiguracji powłoki.

Kiedy używasz aliasu, jest dokładnie tak, jakbyś go wpisał, więc jest dość elastyczny. Na przykład możesz używać go z potokami:

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

Powinieneś być w stanie dokonywać „niewielkich zmian”, przekazując wszelkie flagi, których jeszcze nie określiłeś.

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches
Nathan Long
źródło
5

Tworzę minimalne skrypty powłoki dla moich częstych poleceń i nadaję im krótkie nazwy. Wszystkie są przechowywane w tym samym miejscu, do którego dodano PATH.

W ten sposób mam dostęp do skrótów do bardzo skomplikowanych poleceń i w przeciwieństwie do aliastego, mogę zmienić zmienne części mojego zadania w argumenty wiersza poleceń mojego skrótu.

David Grellscheid
źródło
3
Jeśli chcesz tylko przekazać argumenty, rozważ zamiast tego zdefiniowanie funkcji. Jeśli potrzebujesz pełnych skryptów, jest to dobre rozwiązanie :)
Konerak,
@Konerak Będę musiał spróbować. Zazwyczaj robię po prostu skrypt, ale zakładam, że definiowanie funkcji byłoby o wiele czystsze.
ixtmixilix,
4

Utrzymuję kopię .bash_history w Git . Aby to uprościć, ustawiłem

# 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

w .bashrc oraz następujące polecenia (zmodyfikowane do ogólnego użytku) w skrypcie czyszczącym

# 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"

które uruchamiam przed dodaniem wierszy git gui. Ponieważ plik historii jest modyfikowany przy każdym poleceniu, mam również specjalne polecenie do aktualizacji tego konkretnego repozytorium:

git stash && git pull && git stash pop
l0b0
źródło
+1 przede wszystkim za wzmiankę HISTCONTROL=ignorespace, co jest ważne, aby czasami nie zagracać historii.
quodlibetor
2

Wśród wszystkich innych odpowiedzi tutaj dotyczących historii.

ustawiłem

HISTFILESIZE=2024
HISTSIZE=1024

w ~ / .bash_profile

Oprócz innych komentarzy dotyczących: historii

Kolejna przydatna funkcja ...

Rozpoczęcie przypominania historii

!first few letters<ESC>Ctrl-E

przywoła ostatnie polecenie, które zaczęło się od kilku pierwszych liter

na przykład:

!find<ESC>Ctrl-E

Nie wspomniałeś, czy używasz GUI, czy tylko wiersza poleceń. Jeśli korzystasz z GUI, możesz użyć jednego z trwałych menedżerów schowka do kopiowania / wklejania często używanych poleceń, identyfikatorów użytkowników, haseł, adresów URL itp.

bsd
źródło
Wow, !find<ESC>CTRL-Edziała, ale wątpię, czy będę mógł to zapamiętać jutro. Co to jest ESC CTRL-E?
Konerak,
tylko powiązanie z rozszerzonym klawiszem
bsd
0

Nauczenie się obsługi Ctrl-Ri Ctrl-Spozwala na łatwe wyszukiwanie poleceń, których szukasz w historii, a już znalazłeś zmienną środowiskową HISTCONTROL, aby zignorować duplikaty i zmienić stronę pliku historii bash.

Zazwyczaj robię wiele, Ctrl-Ra następnie Ctrl-Ezmieniam niektóre parametry, jeśli pominąłem znalezione polecenie, uderzając Ctrl-Rje zbyt wiele razy, Ctrl-Sby uratować.

Evgeny
źródło
2
Często tty jest skonfigurowany w taki sposób, że Ctrl-S jest sekwencją „stop” i nie jest (bezpośrednio) dostępny do wyszukiwania do przodu.
enzotib,
W takich przypadkach wyszukiwanie do przodu może być mapowane na coś innego niż <kbd> Ctrl-S </kbd>.
Evgeny,
0

Zawsze wolę przechowywać ostatnio używane polecenia i ich dane wyjściowe.

script filename
Balaswamy Vaddeman
źródło
0

Oprócz powyższych dobrych odpowiedzi, jeśli używasz GUI opartego na kde lub gnome, AutoKey może być niezwykle pomocny.

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

Pozwala tworzyć frazy, które są uruchamiane przez wpisanie kilku znaków lub naciśnięcie klawisza skrótu. Te frazy są następnie zastępowane lub dodawane do danych wejściowych.

Obsługuje również skrypty napisane w języku Python, które możesz zrobić prawie wszystko, jeśli znasz język Python. Nie znam jeszcze Pythona, ale już dostaję kilka bardzo prostych skryptów do robienia porządnych rzeczy.

Wygląda na to, że wszystko pochodzi z klawiatury, więc działa z każdą aplikacją, która akceptuje wprowadzanie z klawiatury - i z samym komputerem stacjonarnym.

Ma wiele opcji kontrolujących sposób i miejsce aktywacji tych rzeczy, więc niektóre mogą działać tylko w konsoli, a inne tylko w innym oknie. Możesz także ustawić, aby frazy były uruchamiane, gdy tylko wpiszesz ciąg, który je wyzwala lub poczekaj, aż dasz im OK.

Joe
źródło
0

Jak inni powiedzieli, że alias jest twoim przyjacielem. Dla nieco bardziej skomplikowanych rzeczy (gdy potrzebujesz argumentów między instrukcją) używam funkcji w moim .zshrc, takich jak:

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

który działa jak locate (używam go, gdy z jakiegoś powodu db nie jest dostępny). Lub

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

za namiastkę killall.

rkj
źródło
0

Oprócz używania Cntl-Rdo przeglądania wstecz .bash_history, mam również plik README w ~/developkatalogu, w którym umieszczam długie polecenia, takie jak git/ svn, więc mogę do nich wrócić później, kiedy będę musiał. Podobnie, planuję mieć ~/install/READMEplik do umieszczenia wszystkich popularnych nazw pakietów, które zwykle instaluję po zainstalowaniu nowej wersji Linux / Ubuntu. Pomysł polega więc na umieszczeniu pliku README w każdym katalogu, np. Wideo, Audio, ... i umieszczeniu w nich typowych poleceń / wskazówek, które mogą być potrzebne w późniejszym czasie.

Amr
źródło