1. shell是什么
Shell英文意思是外壳, 用户通过Shell和操作系统交互,Shell就是一个解释器,在Linux输入一条命令可以查看当前正在使用的Shell:
echo $SHELL
当我们输入一条命令Shell就解释执行,这是交互式的方式。shell还有一种批处理的方式(Batch),写一个Script解释执行。
2. shell的基本原理
Linux输入的命令分为内部命令(built-in)以及外部命令,像ls,cat,mkdir这些都属于外部命令,而echo,cd,pwd这些都属于内置命令,用type命令可以辨别是否属于内部命令。
$ type cd
cd is a shell builtin
$ type cat
cat is /bin/cat
内置命令属于Shell的一部分,当Shell一运行起来就随Shell加载入内存,在命令行上输入这些命令就可以像调用函数一样直接使用,效率非常高。命令行输入外部命令,当前的Shell会fork一个子进程,然后调用exec载入这个命令的可执行文件,比如bin/cat,因此效率上稍微低了点。
3. /bin/sh和/bin/bash的区别
shell脚本的开头有一句话定义使用哪种sh解释器来解释脚本。#!是对脚本的解释器程序路径。
GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。
hwl@~/code/Test~$ll /bin/sh
lrwxrwxrwx 1 root root 4 2月 15 2018 /bin/sh -> dash*
hwl@~/code/Test~$ll /bin/bash
-rwxr-xr-x 1 root root 1029720 10月 7 2014 /bin/bash*
一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式。 也就是说 /bin/sh 相当于 /bin/bash --posix
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX )。 是为了提高 UNIX 环境下应用程序的可移植性。