执行shell脚本方式:
法一、绝对路径方式:
[root@Dasoncheng ~]# cat 2.sh #!/bin/bashpstree
[root@Dasoncheng ~]# /root/2.sh├─sshd───sshd───bash───2.sh───pstree##需要具有-x执行权限,因为这样执行 没有指定命令解释器、则会使用脚本里面指定的命令解释器(如#!/bin/bash)去执行该脚本.##如果脚本里面也没有指定,则会调用系统默认的shell解释器(echo $SHELL)查看;##通过pstree可以看到,是单独启动了2.sh这个子shell来执行脚本里面的命令的;
法二、相对路径方式:
[root@Dasoncheng ~]# ./2.sh├─sshd───sshd───bash───2.sh───pstree##同法一,就是路径方式不同;
法三、bash命令调用:
[root@Dasoncheng ~]# sh 2.sh├─sshd───sshd───bash───sh───pstree##这里就是指定了命令解释器bash,即单独启动了sh这个子shell来执行命令;
[root@Dasoncheng ~]# which sh/usr/bin/sh[root@Dasoncheng ~]# ll /usr/bin/shlrwxrwxrwx 1 root root 4 Feb 24 2017 /usr/bin/sh -> bash[root@Dasoncheng ~]# ll /usr/bin/basbase64 basename bash bashbug bashbug-64 [root@Dasoncheng ~]# ll /usr/bin/bash-rwxr-xr-x 1 root root 960472 Dec 7 2016 /usr/bin/bash
法四、". 2.sh"点空格相对路径 或者"./root/2.sh"点空格绝对路径方式:
[root@Dasoncheng ~]# . 2.sh├─sshd───sshd───bash───pstree##这个及下面的绝对路径,都是直接在当前shell环境下面 执行了shell脚本;(没有创建子shell)##其实". "点空格 就是调用了系统里面的一个函数,这里不讲;
[root@Dasoncheng ~]# . /root/2.sh├─sshd───sshd───bash───pstree
说下几种方式的区别:
- 第一种和第二种没有什么区别,两种方式都需要提前赋予脚本以执行权限。
- 第三种是把脚本当做bash的调用来处理,所以,脚本不需要有执行权限就可以执行。
- 前三种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
- 第四种是使脚本内容在当前shell里执行,而不是单独开子shell执行。
开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,不做特殊通道处理的话,父shell是不可见的。
而在当前shell中执行的话,则所有设置的环境变量都是直接生效可用的。