Да, это правильное поведение для Jupyter. Все команды !
выполняются в своей собственной подоболочке, поэтому результат не является постоянным. Вы можете сделать то, что вам нужно, более длительным способом, добавив вместо этого префикс %
:
In [0] : !pwd
/Users/z4
In [1] : %cd ..
/Users
In [2] : %pwd
'/Users'
In [3] : !pwd
/Users
Я бы не стал полагаться на это ни для чего, кроме интерактивных сеансов, для удобства. Если вам нужен сценарий оболочки, напишите сценарий оболочки. Чтобы использовать %
, вам нужно включить «automagi c» (что должно быть по умолчанию).
Вы также можете обойти это в некоторой степени, просто заставив все команды оболочки выполняться в одной и той же оболочке:
In [0] : !pwd && cd .. && pwd
/Users/z4
/Users
In [1] : !pwd
/Users/z4
В этом случае Jupyter передает все после !
к оболочке, и это оболочка, которая интерпретирует &&
обычным способом. Это хак (как и первое решение), поэтому, пожалуйста, будьте осторожны с полученным поведением.