1

我的理解是,当我在 BASH shell 中使用诸如启动子 shell 的语法执行脚本$ ./myscript.sh并且代码在该 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\]'

如果我放弃#!/bin/bash并使用source此脚本会更改我的命令提示符。是否可以以我可以调用它的方式将它安排在脚本中,$ ./myscript.sh并且它会对我当前的 shell 而不是子 shell 进行更改?

4

1 回答 1

6

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

您可以使用 shebang 行获取脚本。它在获取时被简单地忽略。

于 2013-10-10T20:02:59.333 回答