выполнить команду Bash из IPython

Я хочу, чтобы источник моей среды bash при выполнении команды bash из IPython с помощью ! оператора, что позволяет мне получить доступ к моим определенным функциям bash:

In[2]: !<my_fancy_bash_function> <function_argument>

в настоящее время IPython является источником sh а не bash:

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

Как исправить bash и установить параметры моей среды из IPython?

Ответ 1

Фернандо Перес, создатель IPython, предлагает следующее:

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

Это работает на текущей стабильной версии (0.13.2). Он признает это немного неуклюжим и приветствует запросы на тягу. , ,

Ответ 2

Если ! реализация использует IPython.utils._process_posix.system под капотом, тогда она будет использовать то, which sh возвращает в качестве оболочки обработки. Это может быть истинная реализация оболочки Bourne - это, скорее всего, Bash в некоторых режимах совместимости на многих Linux. На моем MacBook Pro похоже, что это сырая оболочка Bash:

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 но сегодня это не похоже. Вероятно, вы можете ProcessHandler.sh github, изменить ProcessHandler.sh свойства ProcessHandler.sh чтобы заглянуть в os.environ['SHELL'] и использовать это, если оно установлено вместо вызова pexpect.which('sh'). Затем выведите запрос на вытягивание.