Linux shell类型
时间:2008-04-25 来源:legone2008
Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
在RedHat Enterprise Linux中
fflg@/home/fflg> ls -l /bin/sh
lrwxr-xr-x 1 root root 4 2月 18 15:38 /bin/sh -> bash
fflg@/home/fflg> ls -l /bin/bash
-rwxr-xr-x 1 root root 598580 2003-09-18 /bin/bash 可以看出,sh 是bash的一个连接. (1) . file.sh和sh file.sh的区别
. 意思是使用当前shell
sh 是重新打开一个shell(仍然是bash)
所以我们习惯使用. .bash_profile将环境变量加载到当前shell中, 例1: $vi ex.sh 1 FFLG="fflg";export FFLG 保存:"ex.sh" [新] 1L, 24C 已写入 依次执行如下命令,查看结果: fflg@/home/fflg/test/sh> sh ex.sh
fflg@/home/fflg/test/sh> echo $FFLG fflg@/home/fflg/test/sh> . ex.sh
fflg@/home/fflg/test/sh> echo $FFLG
fflg 例2:
$vi export_1.sh
1 val="ffengligang"
2 export val $vi export_2.sh
1 . ./exp_1.sh
2
3 echo "My name is [$val]"
执行命令时,有以下变化:
[1]执行命令:sh export_2.sh 结果:My name is [ffengligang] ###新启动了一个shell
执行:echo $val 结果为空.因为val变量并没有加到当前shell环境变量中
[2]现在修改一下export_2.sh
1 sh ./exp_1.sh #在程序中又打开一个shell
2
3 echo "My name is [$val]"
再执行命令:sh export_2.sh 结果:My name is [] ##结果为空了.因为我们的程序和命令一共加载了两个shell,而val变量存在于程序中打开的那个shell中,而并没有在命令行打开的shell中,同样,当前shell更不会有val变量的值.所以,echo $val也为空
[3]换回第一个程序时的脚本export_2.sh
1 . ./exp_1.sh #在程序中又打开一个shell
2
3 echo "My name is [$val]"
如下执行命令: . export_2.sh #用当前shell执行,程序中也用的".",也为当前shell
结果:My name is [ffengligang]
执行:echo $val 结果:ffengligang
因为程序和命令都使用的是当前shell,而且val值也加到了环境变量中.
fflg@/home/fflg> ls -l /bin/sh
lrwxr-xr-x 1 root root 4 2月 18 15:38 /bin/sh -> bash
fflg@/home/fflg> ls -l /bin/bash
-rwxr-xr-x 1 root root 598580 2003-09-18 /bin/bash 可以看出,sh 是bash的一个连接. (1) . file.sh和sh file.sh的区别
. 意思是使用当前shell
sh 是重新打开一个shell(仍然是bash)
所以我们习惯使用. .bash_profile将环境变量加载到当前shell中, 例1: $vi ex.sh 1 FFLG="fflg";export FFLG 保存:"ex.sh" [新] 1L, 24C 已写入 依次执行如下命令,查看结果: fflg@/home/fflg/test/sh> sh ex.sh
fflg@/home/fflg/test/sh> echo $FFLG fflg@/home/fflg/test/sh> . ex.sh
fflg@/home/fflg/test/sh> echo $FFLG
fflg 例2:
$vi export_1.sh
1 val="ffengligang"
2 export val $vi export_2.sh
1 . ./exp_1.sh
2
3 echo "My name is [$val]"
执行命令时,有以下变化:
[1]执行命令:sh export_2.sh 结果:My name is [ffengligang] ###新启动了一个shell
执行:echo $val 结果为空.因为val变量并没有加到当前shell环境变量中
[2]现在修改一下export_2.sh
1 sh ./exp_1.sh #在程序中又打开一个shell
2
3 echo "My name is [$val]"
再执行命令:sh export_2.sh 结果:My name is [] ##结果为空了.因为我们的程序和命令一共加载了两个shell,而val变量存在于程序中打开的那个shell中,而并没有在命令行打开的shell中,同样,当前shell更不会有val变量的值.所以,echo $val也为空
[3]换回第一个程序时的脚本export_2.sh
1 . ./exp_1.sh #在程序中又打开一个shell
2
3 echo "My name is [$val]"
如下执行命令: . export_2.sh #用当前shell执行,程序中也用的".",也为当前shell
结果:My name is [ffengligang]
执行:echo $val 结果:ffengligang
因为程序和命令都使用的是当前shell,而且val值也加到了环境变量中.
相关阅读 更多 +