Как запустить скрипт в одном сеансе без exec?

893
user1517650

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

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

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

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

0
«virtualenv» не является часто обсуждаемой темой в этом сообществе. Не могли бы вы вкратце объяснить, что это такое, и описать более конкретно, что скрипт делает и чего не делает (что вы хотите, чтобы он делал?), И о каком псевдониме вы говорите? Пожалуйста, не отвечайте в комментариях; [отредактируйте] ваш вопрос, чтобы сделать его более понятным и полным. G-Man 8 лет назад 0

1 ответ на вопрос

1
Scott

Some shell commands (such as cd) affect the current shell and its child/descendent processes, but cannot affect the parent shell.  When you run a script as an ordinary command (e.g., scriptname.sh or ./scriptname.sh), it runs in a separate shell process.  When that shell process terminates, the effects of those commands go away.  That's why scripts like yours often end with exec sh, exec bash, exec zsh, or whatever — it causes the process that's in the new environment to persist, as an interactive shell.

If you don't want to do it that way, the only other approach is to run the script in your main, interactive shell.  In bash, you can do this with

source scriptname.sh

or

. scriptname.sh

(You may need to use ./scriptname.sh if the script is in the current directory.)  I'm pretty sure zsh has the same functionality.  The syntax might be different; check the documentation for your shell.

If you have trouble remembering to do this (or if it gets cumbersome), considering defining an alias for it.