Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch,类似与windows 下的批处理.bat 文件),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。
常见的 Shell 有 sh、bash、csh、tcsh、ash 等。
shell 是一个程序,一般都是放在/bin 或者/user/bin目录下,当前linux 系统可用的shell 都记录在/etc/shells文件中。如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:
echo $SHELL
vim /etc/passwd
其中最后一列显示了用户对应的shell类型
root:x:0:0:root:/root:/bin/bash
saned:x:119:127::/var/lib/saned:/bin/false
usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
zhang:x:1000:1000:zhang,,,:/home/zhang:/bin/bash
mysql:x:1001:1001::/home/mysql:/sbin/nologin
www:x:1002:1002::/home/www:/sbin/nologin
referee:x:1003:1003::/home/referee:/bin/sh
用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以c常用的cd、alias、umask、exit等命令即是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册中查看内建命令,应该执行
man bash-builtins
或者
man builtins
shell 运行方式
当 shell 脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境文件(通常是. bashrc),然后从该环境变量文件开始执行,当读取了ENV文件后,SHELL才开始执行 shell 脚本中的内容。 shell脚本的执行通常可以采用以下三种方式:
bash script-name或 sh script-name(推荐使用) path/ script-name或 ./script-name(当前路径下执行脚本) source script-name或. script-name#一注意“.”点号和script-name 之间有空格。
执行说明:
第一种方法是当脚本文件本身没有可执行权限(即文件x位为-号)时常使用的方法,这里推荐用bash执行,或者文件开头没有指定解释器。
第二种方法需要先将脚本文件的权限改为可执行(即文件加x位),具体方法: chmod u+x script-name或 chmod755 script-name,然后通过脚本路径就可以直接执行脚本了。
第三种方法通常是使用source 或者 “.”号读入或加载指定的shell 脚本文件(son.sh),然后,依次执行该指定shell 脚本文件son.sh 中的所有的语句。这些语句将作为当前父shell 脚本father.sh 进程的一部分运行。因此,使用source 或者”.” 号可以将子shell(son.sh) 自身脚本中的变量的值或者函数等的返回值传递到当前父shell 脚本(father.sh) 中使用。这是第三种方法和前两种方法的最大区别,在linux 中很多配置文件修改后就是直接source 执行的。
source 或者 “.” 点号命令的功能是在当前shell 中执行source 或者”.” 点号加载并执行的相关脚本文件中的命令及语句,而不是产生一个子shell 来执行命令文件中的命令。
zhang@zhang:~/Code/Shell$ cat exec_method.sh #! /bin/bash echo "set varriable begin...." current_dir=`pwd` echo "set varriable end..." echo "current dir is : "$current_dir zhang@zhang:~/Code/Shell$ /bin/bash exec_method.sh set varriable begin.... set varriable end... current dir is : /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$ echo $current_dir zhang@zhang:~/Code/Shell$ chmod u+x exec_method.sh zhang@zhang:~/Code/Shell$ ./exec_method.sh set varriable begin.... set varriable end... current dir is : /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$ echo $current_dir zhang@zhang:~/Code/Shell$ . exec_method.sh set varriable begin.... set varriable end... current dir is : /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$ echo $current_dir /home/zhang/Code/Shell zhang@zhang:~/Code/Shell$
由上面执行结果可以看出,. 或 source 方式执行脚本与前面两种执行方式的不同点–以这种方式执行的脚本中声明的变量, 都可以在当前shell 中得以继续使用,使用.(点号)方式的时候一定要注意,点号和执行脚本之间的空格。