由ORACLE_SID想到脚本的四种运行方法

以前学习脚本知道一个概念,关于脚本运行方式的问题,我们熟知的脚本运行方式有以下几种:

(1)、./script.sh (点斜线脚本)

(2)、sh script.sh (sh空格脚本)

(3)、source script.sh (source空格脚本)

(4)、. script.sh (点空格脚本)

 

先写个简单的脚本,把执行结果贴在下面,然后分别对这几种脚本运行方式作解释。

 

script.sh内容如下:

-------------------------------

#!/bin/bash

echo "The Shell's PID is "$$

export TEST=abc

echo "TEST env is "$TEST

-------------------------------

首先来看第(1)种运行脚本的方式,

$ unset TEST

$ ps

  PID TTY           TIME CMD

39284 pts/1    00:00:00 bash

39441 pts/1    00:00:00 ps

$ ./script.sh

The Shell's PID is  39444

TEST env is abc

$ echo  '**'$TEST'**'

****

再来看第(2)种运行脚本的方式,

$ unset TEST

$ ps

  PID TTY           TIME CMD

39284 pts/1    00:00:00 bash

39453 pts/1    00:00:00 ps

$ sh script.sh

The Shell's PID is  39456

TEST env is abc

$ echo  '**'$TEST'**'

****

再来看第(3)种运行脚本的方式,

$ unset TEST

$ ps

  PID TTY           TIME CMD

39284 pts/1    00:00:00 bash

39457 pts/1    00:00:00 ps

$ source  script.sh

The Shell's PID is  39284

TEST env is abc

$ echo  '**'$TEST'**'

**abc**

最后来看第(4)种运行脚本的方式,

$ unset TEST

$ ps

  PID TTY           TIME CMD

39284 pts/1    00:00:00 bash

39462 pts/1    00:00:00 ps

$ . script.sh

The Shell's PID is  39284

TEST env is abc

$ echo  '**'$TEST'**'

**abc**

 

第一种和第二种运行脚本的方式都是开启了一个子shell,

第三种和第四种是在当前shell中操作脚本中内容的,

所以第一种和第二种执行的时候所产生的PID跟当前shell产生的PID不同,而定义在子shell中的环境变量在父shell中是不能够得到共享的。所以脚本结束之后再echo变量就是空的了。


第三种和第四种由于是在当前shell中执行的,执行脚本时不会产生子shell,

所以PID与当前shell相同。

而定义的变量也在脚本执行结束之后被当前shell所共享到。

 

这个操作会用在哪里呢?

之前学过但是一直不知道怎么用,所以忘了,当需要的时候想起来如获珍宝。


我在我的Linux中装了Oracle,并创建3个库,所以有3个ORACLE_SID的变量,所以写了一个脚本用来在不同的instance之间切换。Oracle虽然已经提供给我们好用的脚本了,但是我还是喜欢简单的东西。

 

下面脚本可以切换更多东西,装完Oracle会或得这个脚本

$ which oraenv

/usr/local/bin/oraenv

 

我的脚本更加简单

#!/bin/bash

case  "$1" in

orcl) export  ORACLE_SID=orcl

;;

test) export ORACLE_SID=test

;;

testasm) export  ORACLE_SID=testasm

;;

*) echo  "Input Error!"

;;

esac

 

通过刚才的演示知道,如果想要让脚本中的环境变量生效那么应该使用下面的方式执行脚本

$ . chenv orcl

你可能感兴趣的