Shell脚本执行的几种方式

文章详细介绍了Shell脚本的多种执行方式,包括通过bash命令创建子shell进程,使用脚本的绝对路径和相对路径执行,以及使用source和.(点)命令在当前shell中执行脚本。同时,讨论了权限(+x)对执行的影响,特别是source命令在不需脚本执行权限的情况下也能运行并影响当前shell的环境变量。
摘要由CSDN通过智能技术生成

Shell脚本执行的几种方式

在这里插入图片描述
前面两种是通过创建子shell进程来解释执行脚本。父shell可能获取不到子shell的一些环境变量。
source是在当前shell进程里面直接执行。

父子shell的演示

  1. 创建子shell进程

bash命令创建子shell进程
ps -ef|grep bash 查看shell进程

[root@localhost ~]# ps -ef|grep bash
root        864      1  0 6月27 ?       00:00:00 /bin/bash /usr/sbin/ksmtuned
root       1965   1949  0 6月27 tty1    00:00:02 -bash
root       3449   3433  0 00:09 pts/0    00:00:00 -bash
root       3496   3449  0 00:10 pts/0    00:00:00 grep --color=auto bash
[root@localhost ~]# bash
[root@localhost ~]# ps -ef|grep bash
root        864      1  0 6月27 ?       00:00:00 /bin/bash /usr/sbin/ksmtuned
root       1965   1949  0 6月27 tty1    00:00:02 -bash
root       3449   3433  0 00:09 pts/0    00:00:00 -bash
root       3505   3449  0 00:10 pts/0    00:00:00 bash
root       3534   3505  0 00:10 pts/0    00:00:00 grep --color=auto bash
[root@localhost ~]# bash
[root@localhost ~]# ps -ef|grep bash
root        864      1  0 6月27 ?       00:00:00 /bin/bash /usr/sbin/ksmtuned
root       1965   1949  0 6月27 tty1    00:00:02 -bash
root       3449   3433  0 00:09 pts/0    00:00:00 -bash
root       3505   3449  0 00:10 pts/0    00:00:00 bash
root       3535   3505  0 00:10 pts/0    00:00:00 bash
root       3566   3535  0 00:11 pts/0    00:00:00 grep --color=auto bash

可以看到,第一次执行bash后,创建了个父进程是3499的子进程;第二次执行bash后,创建两个父进程是3505(第一次创建的进程)的子进程。

  1. 退出子shell进程

exit 退出子shell进程

[root@localhost ~]# ps -ef|grep bash
root        864      1  0 6月27 ?       00:00:00 /bin/bash /usr/sbin/ksmtuned
root       1965   1949  0 6月27 tty1    00:00:02 -bash
root       3449   3433  0 00:09 pts/0    00:00:00 -bash
root       3505   3449  0 00:10 pts/0    00:00:00 bash
root       3535   3505  0 00:10 pts/0    00:00:00 bash
root       3566   3535  0 00:11 pts/0    00:00:00 grep --color=auto bash
[root@localhost ~]# exit
exit
[root@localhost ~]# ps -ef|grep bash
root        864      1  0 6月27 ?       00:00:00 /bin/bash /usr/sbin/ksmtuned
root       1965   1949  0 6月27 tty1    00:00:02 -bash
root       3449   3433  0 00:09 pts/0    00:00:00 -bash
root       3505   3449  0 00:10 pts/0    00:00:00 bash
root       3616   3505  0 00:17 pts/0    00:00:00 grep --color=auto bash
[root@localhost ~]# exit
exit
[root@localhost ~]# ps -ef|grep bash
root        864      1  0 6月27 ?       00:00:00 /bin/bash /usr/sbin/ksmtuned
root       1965   1949  0 6月27 tty1    00:00:02 -bash
root       3449   3433  0 00:09 pts/0    00:00:00 -bash
root       3626   3449  0 00:17 pts/0    00:00:00 grep --color=auto bash

1. 创建shell脚本hello.sh

在/home目录下创建文件夹jiaoben,在文件夹里面创建hello.sh文件

[root@localhost home]# mkdir jiaoben
[root@localhost home]# cd jiaoben/
[root@localhost jiaoben]# ll
总用量 0
[root@localhost jiaoben]# touch hello.sh
[root@localhost jiaoben]# vi hello.sh
[root@localhost jiaoben]# ll
总用量 4
-rw-r--r--. 1 root root 26 627 23:29 hello.sh

hello.sh的内容为

#!/bin/bash

echo "Hello!"

脚本以 #!/bin/bash 开头,指定shell解析器

2. bash/sh 脚本的绝对路径/相对路径

不管脚本有没有x(可执行)权限,都可以执行

2.1 sh 脚本的相对路径执行脚本

[root@localhost jiaoben]# pwd
/home/jiaoben
[root@localhost jiaoben]# sh hello.sh
Hello!

2.2 sh 脚本的绝对路径执行脚本

[root@localhost jiaoben]# sh /home/jiaoben/hello.sh
Hello!

2.3 bash 脚本的相对路径执行脚本

[root@localhost jiaoben]# bash hello.sh
Hello!

2.4 bash 脚本的绝对路径执行脚本

[root@localhost jiaoben]# bash /home/jiaoben/hello.sh
Hello!

3. 脚本的绝对路径/相对路径(需要脚本的+x权限)

3.1 脚本的相对路径执行脚本

./hello.sh

[root@localhost jiaoben]# pwd
/home/jiaoben
[root@localhost jiaoben]# ll
总用量 4
-rw-r--r--. 1 root root 26 627 23:29 hello.sh
[root@localhost jiaoben]# ./hello.sh
-bash: ./hello.sh: 权限不够
[root@localhost jiaoben]# chmod +x hello.sh
[root@localhost jiaoben]# ./hello.sh
Hello!
[root@localhost jiaoben]# ll
总用量 4
-rwxr-xr-x. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# ./hello.sh
Hello!

从上面可以看到,执行./hello.sh需要x权限

3.2 脚本的绝对路径执行脚本

/home/jiaoben/hello.sh

  1. 收回hello.sh的x(可执行)权限,然后执行脚本
[root@localhost jiaoben]# chmod -x hello.sh
[root@localhost jiaoben]# ll
总用量 4
-rw-r--r--. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# /home/jiaoben/hello.sh
-bash: /home/jiaoben/hello.sh: 权限不够
  1. 给脚本hello.sh添加x(可执行)权限,通过脚本绝对路径再执行脚本
[root@localhost jiaoben]# chmod +x hello.sh
[root@localhost jiaoben]# ll
总用量 4
-rwxr-xr-x. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# /home/jiaoben/hello.sh
Hello!

4. source 脚本的绝对路径/相对路径执行脚本

source执行脚本时,不管脚本有没有x(可执行权限),脚本都可以执行
我们平时配置完环境变量,用的就是source执行,如source /etc/profile

4.1 source相对路径执行脚本

source hello.sh

[root@localhost jiaoben]# ll
总用量 4
-rwxr-xr-x. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# source hello.sh
Hello!

4.2 source绝对路径执行脚本

source /home/jiaoben/hello.sh

[root@localhost jiaoben]# ll
总用量 4
-rwxr-xr-x. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# source /home/jiaoben/hello.sh
Hello!

hello.sh没有x(可执行)权限时候,使用source执行情况:

[root@localhost jiaoben]# chmod -x hello.sh
[root@localhost jiaoben]# ll
总用量 4
-rw-r--r--. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# source hello.sh
Hello!
[root@localhost jiaoben]# source /home/jiaoben/hello.sh
Hello!

5. .空格脚本的绝对路径/相对路径执行脚本

.空格绝对路径/相对路径执行脚本时候,不管脚本有没有x(可执行)权限,都可以执行。
下面我们李子都使用没有x(可执行)权限的x脚本来验证。

5.1 .空格脚本的相对路径执行脚本

. hello.sh

[root@localhost jiaoben]# ll
总用量 4
-rw-r--r--. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# . hello.sh
Hello!

5.2 .空格脚本的绝对路径执行脚本

[root@localhost jiaoben]# ll
总用量 4
-rw-r--r--. 1 root root 27 627 23:38 hello.sh
[root@localhost jiaoben]# . /home/jiaoben/hello.sh
Hello!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值