Bash:在调用shell的上下文中执行脚本

jwb*_*ley 0 bash shell subshell

我的理解是当我在BASH shell中执行脚本时,使用类似$ ./myscript.sh子shell的语法启动并且代码在该shell中运行,并且在我的shell上打印STDOUT和STDERR输出,STDIN取自我的shell.这就是脚本的交互方式.

文件" myscript " 的顶行是#!/bin/bash,这表示用于在脚本文件中执行语法的解释器.

如果我使用语法source myscript.sh,我的脚本中的代码被"拉"到我当前的环境并在那里执行,而不是在子shell中执行.我无法在我调用的脚本中运行以下代码$ ./myscript.sh并影响我当前的shell:

#!/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\]'
Run Code Online (Sandbox Code Playgroud)

如果我删除#!/bin/bash并使用source此脚本更改我的命令提示符.它可以以一种我可以调用它的方式安排在一个脚本中$ ./myscript.sh,它会改变我当前的shell,而不是子shell吗?

cho*_*oba 5

一旦你没有调用脚本source,它就会在子shell中运行,并且无法更改父shell的环境.

您可以使用shebang行来源脚本.它只是在被采购时被忽略.