shell.txt
217 lines
| 7.6 KiB
| text/plain
|
TextLexer
Brian E Granger
|
r1258 | .. _ipython_as_shell: | ||
========================= | ||||
IPython as a system shell | ||||
========================= | ||||
MinRK
|
r7709 | |||
Brian Granger
|
r2276 | |||
Brian E Granger
|
r1258 | Overview | ||
======== | ||||
Paul Ivanov
|
r11608 | It is possible to adapt IPython for system shell usage. In the past, IPython | ||
shipped a special 'sh' profile for this purpose, but it had been quarantined | ||||
since 0.11 release, and in 1.0 it was removed altogether. Nevertheless, much | ||||
of this section relies on machinery which does not require a custom profile. | ||||
Paul Ivanov
|
r11607 | |||
Paul Ivanov
|
r11608 | You can set up your own 'sh' :ref:`profile <Profiles>` to be different from | ||
the default profile such that: | ||||
Paul Ivanov
|
r11607 | |||
* Prompt shows the current directory (see `Prompt customization`_) | ||||
Paul Ivanov
|
r11608 | * Make system commands directly available (in alias table) by running the | ||
``%rehashx`` magic. If you install new programs along your PATH, you might | ||||
want to run ``%rehashx`` to update the alias table | ||||
Paul Ivanov
|
r11607 | * turn ``%autocall`` to full mode | ||
Brian E Granger
|
r1258 | |||
Paul Ivanov
|
r11608 | |||
Brian E Granger
|
r1258 | Aliases | ||
======= | ||||
Paul Ivanov
|
r11607 | Once you run ``%rehashx``, all of your $PATH has been loaded as IPython aliases, | ||
so you should be able to type any normal system command and have it executed. | ||||
See ``%alias?`` and ``%unalias?`` for details on the alias facilities. See also | ||||
``%rehashx?`` for details on the mechanism used to load $PATH. | ||||
Brian E Granger
|
r1258 | |||
Directory management | ||||
==================== | ||||
Since each command passed by ipython to the underlying system is executed | ||||
in a subshell which exits immediately, you can NOT use !cd to navigate | ||||
the filesystem. | ||||
Paul Ivanov
|
r11607 | IPython provides its own builtin ``%cd`` magic command to move in the | ||
Brian E Granger
|
r1258 | filesystem (the % is not required with automagic on). It also maintains | ||
Paul Ivanov
|
r11607 | a list of visited directories (use ``%dhist`` to see it) and allows direct | ||
switching to any of them. Type ``cd?`` for more details. | ||||
Brian E Granger
|
r1258 | |||
Paul Ivanov
|
r11607 | ``%pushd``, ``%popd`` and ``%dirs`` are provided for directory stack handling. | ||
Brian E Granger
|
r1258 | |||
Paul Ivanov
|
r11607 | Environment variables | ||
===================== | ||||
Brian E Granger
|
r1258 | |||
%env can be used to "remember" environment variable manipulations. Examples:: | ||||
%env - Show all environment variables | ||||
%env VISUAL=jed - set VISUAL to jed | ||||
%env PATH+=;/foo - append ;foo to PATH | ||||
%env PATH+=;/bar - also append ;bar to PATH | ||||
%env PATH-=/wbin; - prepend /wbin; to PATH | ||||
%env -d VISUAL - forget VISUAL persistent val | ||||
%env -p - print all persistent env modifications | ||||
Prompt customization | ||||
==================== | ||||
Paul Ivanov
|
r11607 | Here are some prompt configurations you can try out interactively by using the | ||
``%config`` magic:: | ||||
%config PromptManager.in_template = r'{color.LightGreen}\u@\h{color.LightBlue}[{color.LightCyan}\Y1{color.LightBlue}]{color.Green}|\#> ' | ||||
%config PromptManager.in2_template = r'{color.Green}|{color.LightGreen}\D{color.Green}> ' | ||||
%config PromptManager.out_template = r'<\#> ' | ||||
Brian E Granger
|
r1258 | |||
Paul Ivanov
|
r11607 | |||
You can change the prompt configuration to your liking permanently by editing | ||||
``ipython_config.py``:: | ||||
Thomas Kluyver
|
r5551 | c.PromptManager.in_template = r'{color.LightGreen}\u@\h{color.LightBlue}[{color.LightCyan}\Y1{color.LightBlue}]{color.Green}|\#> ' | ||
c.PromptManager.in2_template = r'{color.Green}|{color.LightGreen}\D{color.Green}> ' | ||||
c.PromptManager.out_template = r'<\#> ' | ||||
Brian E Granger
|
r1258 | |||
Paul Ivanov
|
r11608 | Read more about the :ref:`configuration system <config_overview>` for details | ||
on how to find ``ipython_config.py``. | ||||
Thomas Kluyver
|
r5443 | .. _string_lists: | ||
Brian E Granger
|
r1258 | |||
String lists | ||||
============ | ||||
Brian Granger
|
r2498 | String lists (IPython.utils.text.SList) are handy way to process output | ||
Brian E Granger
|
r1258 | from system commands. They are produced by ``var = !cmd`` syntax. | ||
First, we acquire the output of 'ls -l':: | ||||
[Q:doc/examples]|2> lines = !ls -l | ||||
== | ||||
['total 23', | ||||
'-rw-rw-rw- 1 ville None 1163 Sep 30 2006 example-demo.py', | ||||
'-rw-rw-rw- 1 ville None 1927 Sep 30 2006 example-embed-short.py', | ||||
'-rwxrwxrwx 1 ville None 4606 Sep 1 17:15 example-embed.py', | ||||
'-rwxrwxrwx 1 ville None 1017 Sep 30 2006 example-gnuplot.py', | ||||
'-rwxrwxrwx 1 ville None 339 Jun 11 18:01 extension.py', | ||||
'-rwxrwxrwx 1 ville None 113 Dec 20 2006 seteditor.py', | ||||
'-rwxrwxrwx 1 ville None 245 Dec 12 2006 seteditor.pyc'] | ||||
Now, let's take a look at the contents of 'lines' (the first number is | ||||
the list element number):: | ||||
[Q:doc/examples]|3> lines | ||||
<3> SList (.p, .n, .l, .s, .grep(), .fields() available). Value: | ||||
0: total 23 | ||||
1: -rw-rw-rw- 1 ville None 1163 Sep 30 2006 example-demo.py | ||||
2: -rw-rw-rw- 1 ville None 1927 Sep 30 2006 example-embed-short.py | ||||
3: -rwxrwxrwx 1 ville None 4606 Sep 1 17:15 example-embed.py | ||||
4: -rwxrwxrwx 1 ville None 1017 Sep 30 2006 example-gnuplot.py | ||||
5: -rwxrwxrwx 1 ville None 339 Jun 11 18:01 extension.py | ||||
6: -rwxrwxrwx 1 ville None 113 Dec 20 2006 seteditor.py | ||||
7: -rwxrwxrwx 1 ville None 245 Dec 12 2006 seteditor.pyc | ||||
Now, let's filter out the 'embed' lines:: | ||||
[Q:doc/examples]|4> l2 = lines.grep('embed',prune=1) | ||||
[Q:doc/examples]|5> l2 | ||||
<5> SList (.p, .n, .l, .s, .grep(), .fields() available). Value: | ||||
0: total 23 | ||||
1: -rw-rw-rw- 1 ville None 1163 Sep 30 2006 example-demo.py | ||||
2: -rwxrwxrwx 1 ville None 1017 Sep 30 2006 example-gnuplot.py | ||||
3: -rwxrwxrwx 1 ville None 339 Jun 11 18:01 extension.py | ||||
4: -rwxrwxrwx 1 ville None 113 Dec 20 2006 seteditor.py | ||||
5: -rwxrwxrwx 1 ville None 245 Dec 12 2006 seteditor.pyc | ||||
Now, we want strings having just file names and permissions:: | ||||
[Q:doc/examples]|6> l2.fields(8,0) | ||||
<6> SList (.p, .n, .l, .s, .grep(), .fields() available). Value: | ||||
0: total | ||||
1: example-demo.py -rw-rw-rw- | ||||
2: example-gnuplot.py -rwxrwxrwx | ||||
3: extension.py -rwxrwxrwx | ||||
4: seteditor.py -rwxrwxrwx | ||||
5: seteditor.pyc -rwxrwxrwx | ||||
Note how the line with 'total' does not raise IndexError. | ||||
If you want to split these (yielding lists), call fields() without | ||||
arguments:: | ||||
[Q:doc/examples]|7> _.fields() | ||||
<7> | ||||
[['total'], | ||||
['example-demo.py', '-rw-rw-rw-'], | ||||
['example-gnuplot.py', '-rwxrwxrwx'], | ||||
['extension.py', '-rwxrwxrwx'], | ||||
['seteditor.py', '-rwxrwxrwx'], | ||||
['seteditor.pyc', '-rwxrwxrwx']] | ||||
If you want to pass these separated with spaces to a command (typical | ||||
for lists if files), use the .s property:: | ||||
[Q:doc/examples]|13> files = l2.fields(8).s | ||||
[Q:doc/examples]|14> files | ||||
<14> 'example-demo.py example-gnuplot.py extension.py seteditor.py seteditor.pyc' | ||||
[Q:doc/examples]|15> ls $files | ||||
example-demo.py example-gnuplot.py extension.py seteditor.py seteditor.pyc | ||||
SLists are inherited from normal python lists, so every list method is | ||||
available:: | ||||
[Q:doc/examples]|21> lines.append('hey') | ||||
Real world example: remove all files outside version control | ||||
Thomas Kluyver
|
r5443 | ------------------------------------------------------------ | ||
Brian E Granger
|
r1258 | |||
First, capture output of "hg status":: | ||||
[Q:/ipython]|28> out = !hg status | ||||
== | ||||
Brian Granger
|
r2064 | ['M IPython\\extensions\\ipy_kitcfg.py', | ||
'M IPython\\extensions\\ipy_rehashdir.py', | ||||
Brian E Granger
|
r1258 | ... | ||
'? build\\lib\\IPython\\Debugger.py', | ||||
Brian Granger
|
r2064 | '? build\\lib\\IPython\\extensions\\InterpreterExec.py', | ||
'? build\\lib\\IPython\\extensions\\InterpreterPasteInput.py', | ||||
Brian E Granger
|
r1258 | ... | ||
(lines starting with ? are not under version control). | ||||
:: | ||||
[Q:/ipython]|35> junk = out.grep(r'^\?').fields(1) | ||||
[Q:/ipython]|36> junk | ||||
<36> SList (.p, .n, .l, .s, .grep(), .fields() availab | ||||
... | ||||
10: build\bdist.win32\winexe\temp\_ctypes.py | ||||
11: build\bdist.win32\winexe\temp\_hashlib.py | ||||
12: build\bdist.win32\winexe\temp\_socket.py | ||||
Now we can just remove these files by doing 'rm $junk.s'. | ||||
The .s, .n, .p properties | ||||
Thomas Kluyver
|
r5443 | ------------------------- | ||
Brian E Granger
|
r1258 | |||
Thomas Kluyver
|
r5443 | The ``.s`` property returns one string where lines are separated by | ||
single space (for convenient passing to system commands). The ``.n`` | ||||
property return one string where the lines are separated by a newline | ||||
Brian E Granger
|
r1258 | (i.e. the original output of the function). If the items in string | ||
Thomas Kluyver
|
r5443 | list are file names, ``.p`` can be used to get a list of "path" objects | ||
Brian Granger
|
r2275 | for convenient file manipulation. | ||