shell 初步之运行方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_referee/article/details/82975673

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脚本的执行通常可以采用以下三种方式:

  1.  bash script-name或 sh script-name(推荐使用)
  2. path/ script-name或 ./script-name(当前路径下执行脚本)
  3.  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 中得以继续使用,使用.(点号)方式的时候一定要注意,点号和执行脚本之间的空格。

猜你喜欢

转载自blog.csdn.net/zhang_referee/article/details/82975673