K procházení v historii příkazů můžeme použít šipku nahoru a dolů.
V některá IDE, jako je Matlab, pokud něco zadáme a poté stiskneme klávesy se šipkami, procházíme pouze mezi historickými příkazy počínaje vstupem, který máme. To je opravdu výhodné, ale v terminálu prostředí shell to nefunguje.
Existuje nějaký způsob, jak získat podobnou funkci v prostředí terminálu prostředí? A nějaké další tipy pro zlepšení efektivity při používání terminálu?
Komentáře
Odpověď
To, co hledáte, je Ctrl R .
Zadejte Ctrl R a poté zadejte část požadovaného příkazu. Bash zobrazí první odpovídající příkaz. Pokračujte v psaní Ctrl R a bash bude procházet předchozími odpovídajícími příkazy.
Chcete-li v historii hledat zpět, zadejte Ctrl Místo toho S . (Pokud Ctrl S takto nefunguje, pravděpodobně to znamená, že musíte deaktivovat řízení toku XON / XOFF: Chcete-li to provést, spusťte stty -ixon
.)
Toto je dokumentováno v části „Hledání“ v části man bash
.
Komentáře
-
Ctrl-Q
k ukončení zmrazeného stavu, pokud již stiskneteCtrl-S
aniž byste nejprve vypnuli řízení toku a zmrazili váš terminál.
Odpovědět
Umístěte je do ~/.inputrc
:
"\e[5~": history-search-backward "\e[6~": history-search-forward
Díky nim je Page Up a Page Down se chovají, jak si přejete. (Některé distribuce to pro vás již nakonfigurovaly.) Osobně mi připadají pohodlnější než Ctrl + R nebo history
.
Komentáře
- Toto je nejvhodnější způsob ve všech současných odpovědích. u plz dej trochu vysvětlení pracovního mechanismu?
-
~/.inputrc
nebo/etc/inputrc
nebo na soubor, na který odkazuje proměnná prostředí$INPUTRC
je konfigurační soubor pro úpravy řádků všech aplikací používajících readline, včetně bash (váš shell). Má určité vestavěné funkce pro úpravy řádků, včetně těchto dvou: v bash ‚ ručním vyhledávání stránek pro jedno z těchto klíčových slov se dozvíte více.\e[5~
/\e[6~
jsou řídicí sekvence generované klávesami Page Up / Down ve většině emulátorů terminálu; zobrazíte jej spuštěním příkazucat
a stisknutím těchto kláves (únikový bajt je v terminálu zastoupen jako^[
, v inputrc jako\e
). - Příklad ve vaší původní otázce říká, že klávesy Nahoru / Dolů fungují v Matlabu tímto způsobem. Bylo by zajímavé sledovat, co se stalo, kdybyste umístili sekvenci Nahoru a Dolů do inputrc a přiřadili této akci; fungovalo by to správně, nebo by to mělo ošklivé vedlejší účinky, protože by to bylo v rozporu s jejich výchozím chováním. Nevím ‚ nevím,
bych rád slyšel vaše zjištění, pokud s tím experimentujete.
echo $INPUTRC
, je prázdný. ‚ m používám Ubuntu 14.04 "\e[A": history-search-backward
a "\e[B": history-search-forward
odpověď
Kromě historie ^ r / ^ s -search:
alt . vloží poslední „slovo“ předchozího příkazu do kurzoru. Opakováním tohoto postupu získáte poslední slovo ze starších příkazů. (Ale všimněte si, že koncové &
se pro příkazy na pozadí počítá jako poslední slovo.)
To je velmi užitečné pro mkdir foo
, cd
alt-dot. Ještě rychlejší než šipka nahoru, ^ a, alt-d (smazat slovo vpřed), cd
.
Chcete-li získat druhé až poslední slovo, použijte esc
-
2
alt+.
(tj. použijte číselný argument ve stylu emacs k alt+.
.Negativní se počítá od konce, pozitivní se počítá dopředu od začátku.) Ale to je obvykle více potíží, než kolik stojí; v určitém okamžiku je rychlejší dosáhnout na myš a kopírovat / vložit, nebo šipka nahoru a ^ w / ^ y jeho část (viz níže).
Pokud je váš terminál nastaven pěkně / správně, ctrl-left a ctrl-right se budou pohybovat dozadu / dopředu slovy. Pokud ne, doufejme, že alespoň alt-b a alt-f udělají totéž.
ctrl- / je zrušení. Automatické opakování můžete použít k efektivnějšímu mazání slov, pokud to můžete vrátit, když trochu přestřelíte.
Účinnější míchání / párování příkazů vychází z použití kill-ring, který funguje stejně jako v Emacsu. ctrl-y pro vložení posledního ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y pro procházení starším zabitým textem.
Vícenásobné ctrl-w nebo cokoli v řadě udělá na vstupu kill-ring. Pokud chcete odstranit dvě věci a vložit pouze jednu později, použijte šipku vlevo a vpravo nebo něco.
Všechny tyto možnosti můžete kombinovat
- začněte psát příkaz
- ctrl-r, abyste se vrátili ke starému příkazu a uchopili jeho část pomocí control-w nebo podobného.
- esc-r nebo
alt+r
k obnovení původního stavu před odstraněním části. - alt-
>
přejdete na konec historie (tj. Celou šipku dolů) a vrátíte se k příkazu, ve kterém jste byli uprostřed.
Další tipy pro interaktivní použití:
Povolte shopt -s globstar
, takže můžete dělat **/*.c
(rekurzivní včetně aktuálního dir). Někdy užitečné pro interaktivní použití, ale obvykle je find -name "*.c" -exec foo {} +
lepší.
Pokud píšete bash skripty, bude pro vás povoleno i ve vašich interaktivních skořápkách. Někdy najdete použití jako *.!(c|h)
k přiřazení souborů, které nekončí s .c nebo .h.
Vyhledejte aliasy, které se vám líbí pro ls -l
, less
a cokoli jiného, co děláte mnoho. (cp -i
, mv -i
a rm -I
jsou milí. Nezvykněte si záleží na tom, aby udělali selektivní rm. GNU rm „s -I jednou požádá o všechny args.)
Líbí se mi alias m=less
(m pro „více“). less
mám nastaveno , a . vázané na předchozí / následující soubor (lesskey
). Výchozí nastavení je sekvence stisknutí více kláves, kterou nelze použít s automatickým opakováním.
Rád dělám vše na obrazovce GNU. Je pro mě snazší sledovat očíslované okna obrazovky než zatížení karet v Konsole (nebo jiném terminálovém emulátoru, který jsem vyzkoušel). Pokud ještě nevíte screen
, naučte se tmux, protože je to novější a méně kruté.
Chcete-li získat něco jako funkce otevírání nového prostředí pomocí stejný cwd jako jiný shell, používám vlastní háček pro cd / pushd / popd, který mi umožňuje cds 8
na cd na cokoli dir my shell in screen window 8 is using. Funguje to i pro skořápky mimo relaci obrazovky, pokud existuje pouze jedna relace obrazovky.
Komentáře
- Důl se ‚ nezdá být “ správně nakonfigurován „. Mnoho klávesových zkratek, které zde vidím, nefunguje ‚, používám stock Terminal z Ubuntu 14.04. Jak jej mohu nakonfigurovat?
- @JorgeeFG: Myslím, že to pro mě fungovalo po vybalení z balíku
gnome-terminal
v Ubuntu 14.04, než jsem přešel na KDE. Příslušná možnost je v nastavení terminálu, esc-prefix vs hig h-bit, a možná některá další nastavení. Některé z nich mi přes ssh nepracují perfektně ‚. (např. ctrl left / right munge the escape-code for the arrow key, and I get5D
appearingly)
Answer
Přidejte následující řádky do ~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Toto je podobné odpovědi egmont, ale místo použití Page Up a Page Down používá únikové sekvence pro Arrow Up a Arrow Down. Tento způsob je mnohem pohodlnější použít na Macu.
Odpověď
Vždy mám sklon konfigurovat své stroje s velkým HISTSIZE hodnotu, takže udržuje delší seznam historie, stejně jako HISTTIMEFORMAT s hodnotou časového razítka, takže Vidím, kdy byl příkaz spuštěn.
export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T "
odpověď
Prostředky, které obvykle používám, jsou kombinace history
příkaz s grep
IE:
history | grep <command im looking for>
Tím se zobrazí očíslovaná historie příkazů, které jste zadali a které obsahují tento příkaz, pak můžete použít:
!<number listed in history command>
k provedení tohoto příkazu.
IE:
history | grep history
142 history 143 history | grep lvresize 568 history | grep echo 570 history | grep echo 571 history | grep history
následovaný: !571
bude opakovat history | grep history
Komentáře
- CR = mnohem lepší + mnohem bezpečnější
- Možná osobně shledávám historii naprogramovanou na grep jako rychlejší prostředek k nalezení většiny příkazů. Pokud jde o Safer, nejsem si ‚ jistý, co máte na mysli, jaká jsou inherentní rizika při používání historie při jejím procházení pomocí cR?
- @ Gravy Mám podezření, že PSkocik znamená, že
!
substituce historie je méně bezpečná. - @Gravy Přirozená rizika by náhodně vyústila ve špatný řádek. Nemáte ponětí, proč váš terminál zamrzl, pokud jste nepoužili Control-S a nemáte povolenou kontrolu toku xon / xoff (často výchozí). Pokud ano, Control-Q to přinese zpět.
- Souhlasím s @PSkocik, cr je mnohem lepší, protože ‚ s jednodušší upravit řádek historie, než jen znovu spustit stejným způsobem. Spuštění stejného příkazu znovu je triviálním případem toho, co můžete udělat, abyste ušetřili čas opakováním variace na složité jednorázové řádky nebo dokončením jiného souboru na dlouhé cestě. Viz moje odpověď.
Odpověď
Používal jsem denně 4 tipy (a některé další) v mém terminálu bash:
-
Spustit poslední příkaz:
!!
-
Provést příkaz N z historie:
!N
-
Vytisknout poslední příkaz začínající předponou z historie:
!prefix:p
-
Spustit poslední příkaz začínající předponou z historie:
!prefix
Komentáře
- Myslím, že použití příkazu N z historie je jedním z největší cesta, jak si vystřelit do nohy pro většinu lidí 🙂 Stačí říct
odpověď
pokud je v pořádku, když místo bash
použijete zsh
, můžete použít oh-mi-zsh pro to.
V historii příkazů se můžete pohybovat pomocí šipek nahoru a dolů. Umožňuje také stejnou navigaci, pokud jste již text zadali (jako v Mathlabu).
edit: Oh-my-zsh je velký softwarový balíček zaměřený na vývojáře, který obsahuje mnoho dalších funkcí, např aliasy, témata, pluginy. Díky těmto doplňkům je distribuce složitější než klávesová zkratka.
https://github.com/robbyrussell/oh-my-zsh
Komentáře
-
oh-my-zsh
obsahuje spoustu věcí. Můžete také říci: Tato přesná funkce je součástí tohoto distribuce, když potřebujete pouze konkrétní nastavení nebo aplikaci. - Upravil jsem příspěvek: Varoval jsem, že je větší než jednoduchá aplikace.
Odpověď
Přidejte následující alias do ~ / .bashrc
alias h="history | awk """""{$1="";print}""""" |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep"
Použití: h fire
mi zobrazí seznam příkazů obsahujících oheň . nebo h ^fire
mi zobrazí seznam příkazů začínajících ohněm .
To je užitečné, když chci zobrazit řadu příkazů zároveň.
Mimochodem, """""
je ošklivý, ale nemohl jsem najít jiné způsoby, jak se vyhnout jednoduchým uvozovkám v jednoduchých uvozovkách.
Komentáře
- fyi –
h="history | awk '{\$1=\"\"; print}'
by měly fungovat. Alternativně vytvořte funkci a zavolejte ji. - děkuji DarkHeart, ale vyzkoušel jsem váš kód, zjistil jsem, že nefunguje v mém prostředí, možná je v mém něco jiného
fish
😉\e[5~
a\e[6~
použijte\e[A
,\e[B
.