Как запустить скрипт в одном сеансе без exec?
У меня есть ниже сценарий, чтобы установить меня в моем проекте:-
#! /bin/zsh
source ~/.zshrc
crld #alias for Project base
cd Kenneth_Love/survivalguide
workon kenneth_tutorial
Этот скрипт работает, но не бросает меня в virtualenv(псевдоним установлен правильно)
Virtualenv, как следует из названия, создает virtualenv, который используется для раздельного управления средой, поэтому он не мешает друг другу, например, где-то, где вы хотите x-версию пакета, и для другого проекта, где вы хотите Y, так что это делает это легко. Выполнение вышеуказанных команд сценария является повторяющейся задачей, но этот сценарий запускается в другом сеансе и затем завершается. Я хочу, чтобы он работал в той же оболочке, в которой я вызываю этот скрипт.
1 ответ
Некоторые команды оболочки (такие как cd
) влияет на текущую оболочку и ее дочерние / дочерние процессы, но не может влиять на родительскую оболочку. Когда вы запускаете скрипт как обычная команда (например, scriptname.sh
или же ./scriptname.sh
), он запускается в отдельном процессе оболочки. Когда этот процесс оболочки завершается, эффекты этих команд исчезают. Вот почему такие сценарии часто заканчиваются на exec sh
, exec bash
, exec zsh
или что-то еще - это заставляет процесс, который находится в новой среде, сохраняться как интерактивная оболочка.
Если вы не хотите делать это таким образом, единственный другой способ - запустить скрипт в основной интерактивной оболочке. В Bash вы можете сделать это с
Исходный сценарий.sh
или же
, имя сценария.sh
(Вам может понадобиться ./scriptname.sh
если скрипт находится в текущем каталоге.) Я уверен, zsh
имеет такую же функциональность. Синтаксис может быть другим; проверьте документацию для вашей оболочки.
Если у вас есть проблемы с запоминанием этого (или если это становится громоздким), подумайте об определении псевдонима для него.