2013-04-10 45 views
14

使用!運營商從IPython中執行bash命令時,從而使我獲得我所定義的bash功能我要採購我的bash環境中執行bash命令比bash從IPython的

In[3]: !declare -F 
sh: 1: declare: not found 

如何採購bash和IPython的設置我的環境設置?

回答

14

費爾南多·佩雷斯,IPython中的創造者,suggests this

In [1]: %%bash 
. ~/.bashrc 
<my_fancy_bash_function> <function_argument> 

這適用於當前穩定版本(0.13.2)。他承認這有點笨拙,歡迎pull requests。 。 。

8

如果!實現使用IPython.utils._process_posix.system,那麼它將使用任何which sh返回作爲處理外殼。這可能是Bourne shell的真正實現 - 它可能在許多Linux的Bash上處於某種兼容模式。在我的MacBook Pro看起來它是一個原始的Bash shell:

In [12]: !declare -F 

In [13]: !echo $BASH 
/bin/sh 

In [14]: !echo $BASH_VERSION 
3.2.48(1)-release 

In [15]: import os 

In [16]: os.environ['SHELL'] 
Out[16]: '/bin/zsh' 

我希望它會使用$SHELL環境變量,但它似乎沒有今天。您可能可以分支github回購,修改ProcessHandler.sh屬性實現,以查看os.environ['SHELL']並使用此設置,而不是調用pexpect.which('sh')。然後發出拉請求。

+0

很好的回覆,謝謝。在你看來,什麼是在'''實現(在你的答案中鏈接到)'產生的過程中建立環境的好方法?對/ bin/sh進行symlinking/bin/bash的快速「貧民區測試」測試併發出'! source〜/ .bashrc && declare -F'不會產生任何結果,而'! env && declare -F'正確地打印出我聲明的變量,但bash函數仍然無法訪問......有什麼想法呢? – chris 2013-04-10 14:46:08

+2

在最近的版本中,您可以使用%% bash cell magic來執行多行bash。 – Matt 2013-04-10 18:24:40

+0

發現了一些相當驚人的東西......你可以使用簡單的'bash'變量擴展技巧來擴展'python'聲明的變量!例如'extension =「。txt」'後面跟着'!ls *「$ extension」'打印所有'.txt'文件! – 2017-11-17 22:17:35