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

时间:2013-10-10 19:56:46

标签: bash shell subshell

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

文件“ 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\]'

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

1 个答案:

答案 0 :(得分:5)

在没有source的情况下调用脚本后,它将在子shell中运行,并且无法更改父shell的环境。

您可以使用shebang行来源脚本。在采购时,它会被忽略。