我的理解是当我使用$ ./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?
答案 0 :(得分:5)
在没有source
的情况下调用脚本后,它将在子shell中运行,并且无法更改父shell的环境。
您可以使用shebang行来源脚本。在采购时,它会被忽略。