Как запустить скрипт в одном сеансе без 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 имеет такую ​​же функциональность. Синтаксис может быть другим; проверьте документацию для вашей оболочки.

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

Другие вопросы по тегам