[bash]
bash 的全称是 Bourne-again shell, 其开发则是GUN计划的 Brian Fox
目的是为了替代 Bourne shell
它是Linux众多发行版和apple (最早是 OSX) 默认的shell, 现如今微软Windows10也有对其的支持
虽然bash是用作sh的替代品, 但是bash并不能完全兼容sh, 这是需要注意的.
在CentOS 6.9 中, sh 是一个连接到 bash 上的连接文件, 因此使用sh 命令和 bash命令效果是一样的
C Shell 家族有两个成员 [csh, tcsh]
[csh]
csh 其设计者是 Bill Joy
由于csh拥有交互的特性, 在1980年, csh以其易于上手的特性, 赢得了青睐
csh的设计理念是使得它开起来更像是 C语言, 并且拥有更好的用户交互性
Bourne shell
#!/bin/shif [ $days -gt 365 ]then
echo This is over a year.
fi
|
|
C shell
#!/bin/cshif ( $days > 365 ) then echo This is over a year.
endif
|
以上这个例子, 可以说明csh 与 bash 中脚本书写的差异性
就以上的脚本而言, csh的可读性略胜一筹
[tcsh]
由于sh有进阶版的bash, csh也有其进阶版,名字就叫tcsh
它是BSD 相关系统的tcsh
简单整理一下
shell 有两大阵型 Bourne shell 与 C shell
Bourne shell (sh) --> Korn shell (ksh)
Bourne shell (sh) --> Bourne again shell (bash) 总多Linux发行版上最流行的shell
csh --> tcsh 如今在BSD系统上最流行的shell
shell 脚本的执行方式
# 执行的脚本
[第一种方式 sh script.sh]
这是一种十分常用的 shell 脚本执行方式. 因为它不需要用户给予脚本执行权限
sh 命令接收 script.sh 这个文件作为传入参数, 开启一个子shell进行命令的解析与执行
[第二种方式 source(.) script.sh]
这种方式, 也不需要用户给予脚本执行权限, 脚本将直接在当前shell中执行
这意味着, 在script.sh 中定义的变量或函数, 在脚本执行结束后, 变量的值或函数返回值等将被保留
(需要注意的是, "." script.sh 这种方式只能在 bash 类型的shell中执行
而 source script.sh 既能在 bash类型 也能在 csh 类型的shell中执行)
[第三种方式 ./script.sh]
这种方式, 用户必须赋予脚本执行权限(chmod a+x script.sh)
才能运行脚本, 该方式也是通过子shell对命令进行解析与执行
[关于 子shell 和 父shell]
简单来说,子shell和父shell的关系有以两点
1.子shell 会复制 父shell的变量和函数, 就如同子女继承父母的基因一样,
2.子shell中设置的变量和函数只有子shell自己知道, 子shell无法改变父shell设定的变量和函数
脚本执行中, 如果使用 source / . 方式执行脚本, 命令会于当前shell中解析执行
下面用一个简单的脚本来体会一下, 当前shell中执行脚本, 和子shell执行脚本的取本
脚本内容
使用当前shell执行完cd命令后, 当前shell的目录发生了变化
使用子shell执行完cd命令后, 当前shell的目录并没有发生改变
------------------------------
参考资料:
// Computer Science: An Overview (12th Edition)
// Kernel (operating system)
// The Origin of the Shell
// Command-line interface
// Why was the word “shell” used to descibe a command-line interface?
// Bash specially-crafted environment variables code injection attack
// What is the ShellShock Bug? (September 2014)
// ShellShock Attack Demonstration
// Bourne shell
// KornShell
// Bash (Unix shell)
// C shell
// tcsh
// Different ways to execute a shell script
网友评论