Portál AbcLinuxu, 2. května 2025 10:45

Hrátky s historií

10.7.2007 13:26 | Přečteno: 3010× | Rady | Výběrový blog | poslední úprava: 12.7.2007 11:45

Po delší době jsem opět zasedl k psaní blogísku. Dneska si vezmu na mušku historii příkazů příkazového interpretu, neboli shellu. Jelikož jsem uživatelem Bashe, bude řeč právě o něm.

Všichni moc dobře určitě známe pohyb nebo lépe řečeno listování v historii pomocí kláves "šipka nahoru" a "šipka dolu". To je však často velmi nepohodlné a zdlouhavé. Naštěstí Bash dovoluje využít vyhledávání v historii. Například pokud víme, že před dvěma dny jsme psali velice dlouhý příkaz a nechce se nám jej většinou vymýšlet znova, tedy alespoň mě ne. Díky reverznímu prohledávání v historie máme ale velmi užitečného pomocníka. Samozřejmě mohli bychom prohledávat historii příkazů pomocí šipky nahoru ale uznejte sami že tohle je poněkud pracné. Hledání v bash historii zpřístupňuje klávesová zkratka CTRL+r. Postačí psát libovolnou část příkazu, dokud se neobjeví ten, který jsme hledali. Úspěšnost hledání závisí na nastavené velikosti historie.

Historie příkazů je v shellu Bash implicitně zapnuta. Vypíná se pomocí holby +H vestavěného příkazu set. Historie je řízena těmito proměnnými: HISTSIZE, HISTFILE, HISTFILESIZE, HISTCONTROL a command_oriented_history. Pokud navíc budeme požadovat osmibitový vstup, musíme do souboru ~/.inputrc vložit následující příkazy:

 
set meta-flag on 
set output-meta on 
set convert-meta off 

Často se setkáváme s pojmy jako interaktivní, neinteraktivní a login shell. Co to vlastně je?
Login shell je interpret příkazů který má jméno ve tvaru "-jmeno", tedy například echo $0 vrátí -bash. Jedná se o první shell uživatele, tedy ten který je spuštěn při přihlášení.
Interaktivní shell je takový, který má svůj standardní vstup i výstup napojen na terminál, často bývá spouštěn s volbou -i. Jak již název vypovídá, je takový shell, který umožňuje přímou interakci s uživatelem.
Neinteraktivní shell Neinteraktivní shell se ukončí při zjištění prvního chybového návratového kódu, který není ve skriptu testován. Shell se neukončuje tehdy, pokud proces s chybným návratovým kódem řídí příkazy if, elif, while, until, nebo pokud je za procesem uveden operátor && nebo || (nebo pokud se návratový kód neguje uvedením !). Pro tento shell není uplatňována historie.

Některé klávesové zkratky

Uvažujeme nastavený mód emacs, je-li nastaven jiný, přepínáme pomocí set -o emacs/vi on

Tab - klávesa, která doplní název proměnné (začíná-li text $), uživatelského jména (začíná-li text ~), hostname (začíná-li text ), příkazu (spustitelného souboru, aliasu i funkce) a jména souboru v pořadí tak, jak bylo napsáno.
Ctrl+a ­- tato kombinace vrátí kurzor na začátek řádky.
Ctrl+l - vyčistí obrazovku ale zachová aktuální řádku tak, jak byla napsána (vhodné, pokud jste neco lehce nevychytali a nechcete, aby to ten, kdo u vás sedí viděl).
Ctrl+e ­- posune kurzor na konec řádku.
Ctrl+r ­- tohle už známe.
Ctrl+s - dopředné hledání v historii příkazů.
Ctrl+t ­- opět skvělá kombinace, prohodí písmenko pod kurzorem s písmenem předcházejícím (obzvlášť vhodné na zkomoleniny typu mroe apod.).
Ctrl+b - přesune kurzor o jeden znak spět.
Ctrl+f - přesune kurzor o jeden znak kupředu.
Ctrl+d - vymaže znak na pozici kurzoru.
Ctrl+_ - o krok zpět, opakuje poslední akci.
Ctrl+w - obdobně jako Alt-DEL (ale ne naprosto stejně) smaže předchozí slovo.
Ctrl+y - vloží před tím smazaný text na aktuální pozici kurzoru na řádce.
Ctrl+p - předchozí příkaz v historii příkazů ,téhož lze dosáhnout šipkou nahoru.
Alt+. - vloží na pozici kurzoru poslední slovo předchozího příkazu (by Ritchie).

Práce jen s historií

history [-počet] - vypíše historii příkazů (posledních "počet" příkazů).
!! - zopakuje poslední příkaz.
!4 - zopakuje příkaz číslo 4.
!$ - zopakuje poslední parametr posledního příkazu.
!^ - zopakuje první parametr posledního příkazu.
!* - zopakuje všechny parametry posledního příkazu.
!:0 - nultý parametr posledního příkazu (čili samotný příkaz bez dalších parametrů).
!:2-4 - druhý až čtvrtý parametr.
!:-3 - nultý až třetí parametr.
!847:2-4 - nemusíme samozřejmě operovat jen s posledním příkazem - takto pracujeme s příkazem číslo 847.
!!:s/řetězec1/řetězec2/ - provede poslední příkaz + nahradí řetězec1 řetězcem2 (stejné jako ^string1^string2^).

Klávesových zkratek je samozřejmě mnohem více, pro další doporučuji prostudovat manuálové stránky Bashe. Klávesové zkratky lze měnit a to v souboru uvedeném v proměnné INPUTRC nebo v souboru ~/.inputrc.

Readline library

Knihovna readline se používá při načítání řádků v interaktivním shellu. Obsahuje soubor funkcí, jejichž pomocí můžeme při zadávání opravovat a vybírat příkazy ze zásobníku historie příkazů. Implicitně jsou použity příkazy editoru Emacs, lze samozřejmě přepnout i do módu editoru Vi.

Literatura

Osobní stránky Jindřicha Vrby
Using Linux
Brandejs, M., Linux: praktický průvodce, Brno: Konvoj, 2003. ISBN 80-7302-050-5        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

10.7.2007 13:35 Lukáš Rýdlo | skóre: 18 | blog: Silný kafe | Brno
Rozbalit Rozbalit vše Re: Hrátky s historijí
Odpovědět | Sbalit | Link | Blokovat | Admin
no až na tu historiji dobrý ;-)
θηριον ειμι
10.7.2007 13:40 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
Rozbalit Rozbalit vše Re: Hrátky s historijí
Odpovědět | Sbalit | Link | Blokovat | Admin
Logni shell?
pol128 avatar 10.7.2007 13:50 pol128 | skóre: 18
Rozbalit Rozbalit vše Re: Hrátky s historijí
Tam si autor skúšal CTRL+t ;-)
10.7.2007 18:22 hub | skóre: 26 | blog: bg
Rozbalit Rozbalit vše Re: Hrátky s historií
Odpovědět | Sbalit | Link | Blokovat | Admin
Možná byste mohl části zápisku nalepit do učebnice.
pele avatar 10.7.2007 19:00 pele | skóre: 28 | blog: Bleabr | UH
Rozbalit Rozbalit vše Re: Hrátky s historií
Pokusim se:)
Pravda má jednu velkou výhodu: člověk si nemusí pamatovat, co řekl.
Václav 10.7.2007 18:28 Václav "Darm" Novák | skóre: 26 | blog: Darmovy_kecy | Bechyně / Praha
Rozbalit Rozbalit vše Re: Hrátky s historií
Odpovědět | Sbalit | Link | Blokovat | Admin
Až na některé ze zkratek to vše funguje v ZSH stejně.
Cross my heart and hope to fly, stick a cupcake in my eye!
pele avatar 10.7.2007 19:00 pele | skóre: 28 | blog: Bleabr | UH
Rozbalit Rozbalit vše Re: Hrátky s historií
To je dobre vedet, diky za info.
Pravda má jednu velkou výhodu: člověk si nemusí pamatovat, co řekl.
11.7.2007 21:21 Jiří Daněk
Rozbalit Rozbalit vše Re: Hrátky s historií
Odpovědět | Sbalit | Link | Blokovat | Admin
Ještě bych rád doplnil, že při vyhledávání pomocí Ctrl + r/s je možné ve vysledcích listovat pomocí stisků ctrl + r dopředu a pomocí Ctrl + s zase dozadu.

---

Byl jeden pán a ten měl psa, HAFUŠA se jmenoval.
11.7.2007 21:48 thefox | skóre: 25 | Ťapešovo
Rozbalit Rozbalit vše Re: Hrátky s historií
Odpovědět | Sbalit | Link | Blokovat | Admin
Takže Ctrl-_ odčiní poslednú akciu! Konečne viem, čo robiť pri najbližšom rm -rf :-).

(Inak trošku sa ti tam miešajú CTRL a Ctrl, ale to je detail.)
0118 999 881 999 119 725 3
pele avatar 11.7.2007 23:09 pele | skóre: 28 | blog: Bleabr | UH
Rozbalit Rozbalit vše Re: Hrátky s historií
Souhlasim to sem napsal blbe, spis by melo byt zopakuje posledni akci, asi.

"Ctrl" opravim.
Pravda má jednu velkou výhodu: člověk si nemusí pamatovat, co řekl.
12.7.2007 08:12 Ritchie | skóre: 27 | blog: Ritchie's | Berlin
Rozbalit Rozbalit vše Re: Hrátky s historií
Odpovědět | Sbalit | Link | Blokovat | Admin
Přidal bych užitečnou, nicméně téměř neznámou klávesovou zkratku Alt + ., která vloží na pozici kurzoru poslední slovo předchozího příkazu.
xvasek avatar 18.7.2007 09:07 xvasek | skóre: 21 | blog: | Zlín
Rozbalit Rozbalit vše Re: Hrátky s historií
Geniální. :-)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.