首页 > 代码库 > 由ORACLE_SID想到脚本的四种运行方法
由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