Bash: выполнить скрипт в контексте вызова оболочки

Насколько я понимаю, когда я выполняю скрипт внутри оболочки BASH с использованием синтаксиса, подобного $ ./myscript.sh, запускается вспомогательная оболочка, и код запускается в этой оболочке, при этом вывод STDOUT и STDERR печатается в моей оболочке, STDIN берется из моей оболочки. Вот как скрипт интерактивен.

Верхняя строка файла «myscript» — это #!/bin/bash, это указывает интерпретатор, который будет использоваться для выполнения синтаксиса в файле сценария.

Если я использую синтаксис source myscript.sh, код в моем скрипте "подтягивается" к моей текущей среде и выполняется там, а не во вспомогательной оболочке. Я не могу запустить следующий код в сценарии, который я вызываю с помощью $ ./myscript.sh и который влияет на мою текущую оболочку:

#!/bin/bash

PS1='`
  if [ $? -eq 0 ];
    then echo -n "\[\033[00;35m\]\u\[\033[01;32m\]@\[\033[00;35m\]\h\[\033[00;32m\](\[\033[01;35m\]\W\[\033[01;32m\])\[\033[00;32m\]\$";
    else echo -n "\[\033[00;35m\]\u\[\033[01;31m\]@\[\033[00;35m\]\h\[\033[01;31m\](\[\033[35m\]\W\[\033[31m\])\[\033[00;31m\]\$";
  fi`\[\033[0m\]'

Если я отброшу #!/bin/bash и использую source, этот скрипт изменит мою командную строку. Можно ли организовать его в сценарии таким образом, чтобы я мог вызвать его с помощью $ ./myscript.sh, и он внесет изменения в мою текущую оболочку, а не в подоболочку?


person jwbensley    schedule 10.10.2013    source источник
comment
Неа. Дочерний процесс не может изменить среду своего родителя.   -  person glenn jackman    schedule 11.10.2013


Ответы (1)


После того, как вы вызвали сценарий без source, он выполняется в подоболочке, и нет возможности изменить среду родительской оболочки.

Вы можете получить сценарий с помощью строки shebang. Он просто игнорируется при получении.

person choroba    schedule 10.10.2013