У меня есть ниже сценарий, чтобы установить меня в моем проекте:-

#! /bin/zsh

source ~/.zshrc
crld #alias for Project base
cd Kenneth_Love/survivalguide
workon kenneth_tutorial

Этот скрипт работает, но не бросает меня в virtualenv(псевдоним установлен правильно)

Virtualenv, как следует из названия, создает virtualenv, который используется для раздельного управления средой, поэтому он не мешает друг другу, например, где-то, где вы хотите x-версию пакета, и для другого проекта, где вы хотите Y, так что это делает это легко. Выполнение вышеуказанных команд сценария является повторяющейся задачей, но этот сценарий выполняется в другом сеансе и затем завершается. Я хочу, чтобы он работал в той же оболочке, в которой я вызываю этот скрипт.

1 ответ1

1

Некоторые команды оболочки (например, cd) влияют на текущую оболочку и ее дочерние / дочерние процессы, но не могут влиять на родительскую оболочку.  Когда вы запускаете скрипт как обычная команда (например, scriptname.sh или ./scriptname.sh), он запускается в отдельном процессе оболочки.  Когда этот процесс оболочки завершается, эффекты этих команд исчезают.  Вот почему сценарии, подобные вашему, часто заканчиваются на exec sh , exec bash , exec zsh или чем-то еще - это заставляет процесс, который находится в новой среде, сохраняться в виде интерактивной оболочки.

Если вы не хотите делать это таким образом, единственный другой способ - запустить скрипт в основной интерактивной оболочке.  В Bash вы можете сделать это с

source scriptname.sh

или же

. scriptname.sh

(Вам может понадобиться использовать ./scriptname.sh если скрипт находится в текущем каталоге.)  Я уверен, что zsh имеет такую же функциональность.  Синтаксис может быть другим; проверьте документацию для вашей оболочки.

Если у вас есть проблемы с запоминанием этого (или если это становится громоздким), подумайте об определении псевдонима для него.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .