Hlavní navigace

IPython jako systémový shell

15. 9. 2008 12:20 (aktualizováno) | Tomáš Ehrlich

Chápu, zní to jako prasárna. Pythoní interpret jako shell. Ale funguje to. A dokonce líp, než kterýkoliv jiný shell, jaký jsem kdy měl (dobře no, zkusil jsem jen Bash a ZSH a díky me přirozené lamosti jsem do nich nikdy nepronikl).

Příkazem ipython -p sh se nám spustí interpreter v shellovém režimu. Ten se oproti klasickému liší v několika drobnostech:

  • Prompt zobrazuje aktuální adresář
  • Mezi jednotlivými příkazy není prázdný řádek
  • Systémové příkazy jsou přístupné přímo (v klasickém režimu až po zavolání funkce %rehashx
  • Funkce up funguje jako cd .. :)

Prompt je možno změnit k obrazu svému spolu s dalším nastavením v ~/.ipython/ipy_user_cfg.py nebo ~/.ipython/ipythonrc-sh

Dostali sme tak kombinaci systémového shellu a Pythoního interpretu. Fungují jak systémové příkazy, tak příkazy jazyka python. Celé je to spolu svázané :)



Příkazy

Chceme-li zavolat systémový příkaz, který nemá vytvořený alias v interpretu, vložíme před něj vykřičník. Ten způsobí, že interpret spustí příkaz (v externím shellu, chápu-li dobře dokumentaci) a výstup zobrazí (nebo uloží do proměnné). Z tohoto důvodu příkaz cd volaný tímto způsobem nebude fungovat, protože !cd změní pracovní adresář v shellu, který ihned po vykonání příkazu zanikne.

Většina příkazů má svůj vytvořeý svůj alias, který zjistíme pomocí cmd?

Při ukládání výstupu příkazu do proměnné musíme psát vykřičník, aby Python věděl, že nepracuje s proměnnou.



Proměnné

Výstup příkazu jde uložit do proměnné, přičemž vznikne seznam řetězců (jeden řádek výstupu = jedna položka seznamu). Tento seznám má definován několik vlastních metod a navíc dědí všechny metody Pythoního Listu.

[~]|1> lines = !ls -l
[~]|2> lines
     SList (.p, .n, .l, .s, .grep(), .fields() available). Value:
0: celkem 8388
1: drwxr-xr-x 3 elvard elvard      72  3. srp 09.35 Angsoc
2: drwxr-xr-x 2 elvard elvard     176 22. srp 10.57 Blender
3: drwxr-xr-x 2 elvard elvard     288 12. zář 18.45 CodeGolf
4: -rw-r--r-- 1 elvard elvard 4720861 18. srp 19.56 hacking-vim.pdf
5: drwxr-xr-x 3 elvard elvard     296 14. zář 04.27 Perl
6: drwxr-xr-x 2 elvard elvard     112 22. srp 11.51 Povray
7: drwxr-xr-x 5 elvard elvard     144 14. zář 21.35 Python
8: drwxr-xr-x 3 elvard elvard     136  7. srp 20.40 TeX
9: -rw-r--r-- 1 elvard elvard 3850701 18. srp 19.55 vimbook.pdf

Interpret nám vždy připomene, že objekt SList má metody .p, .n, .l, .s, .grep(), .fields()

lines je alias pro lines.l což vypíše obsah proměnné jako seznam

.s, resp. .n, Vypíše všechny položky oddělené mezerou, resp. novým řádkem

.grep (regexp, prune=False, field=None) – Zobrazí se jen řádky, které odpovídají regexpu (Při prune=True se zobrazí ty, co neodpovídají). Pokud uvedeme field, tak se porovnává jen určitý sloupec (sloupce jsou odděleny mezerou).

.fields (*fields) – Zobrazí jen určité sloupce. Funguje záporné číslování pro označení sloupce „odzadu“. Sloupce jsou spojeny mezerou. Př.: lines.fields(1, 0)  – Vypíše druhý a první sloupec



Příkaz cd:

Tento příkaz má navíc několik vlastností:
cd – : Poslední navštívený adresář
cd -<n>: N-tý navštívený adresář v historii (od konce)
cd -b : Adresář definovaný pomocí příkazu %bookmark

A zrovna ty bookmarky mi lichotí :)



Příkaz %mglob:

Je zatím to poslední, co stojí za zmínku. Je to jakási kombinace findu a sedu.
Kromě zástupných znaků * a ? se pro vyhledání používá několik modifikátorů:

rec: – vyhledává rekurzivně v daném adresáři

! – z vyhledávání jsou vyloučeny položky odpovídající vzoru

dir: – hledná jen adresáře

Několik příkladů:
files = %mglob !.svn rec:. # vše krom souborů subversion
files = %mglob rec:*.py # jen Pythoní soubory

Získáme tak seznam řetězců, se kterým můžeme dělat psí kusy.



Závěr:

Zkoušel jsem roury, vše vypadá, že funguje. Pokud teda jsou roury vlastností shellu a ne něčeho jiného… A jelikož už mi dochází informace a projevuje se opět ma přirozená lamovost, tak to utnu.

And now something completely different