linux系统shell基本不执行原因,如下测试,编一个一个简单测试test.sh脚本,下边演示了正常的脚本执行三种方法

  1. 脚本前面使用sh test.sh 或者bash test.sh ,这个意思就是使用哪个命令来解析脚本

  2. 第二个是使用.或者source,这两个命令意思,在当前shell执行脚本,脚本变量在当前环境里生效,这里涉及到脚本变量传递过程

  3. 第三种是用的最多的,就是赋予脚本执行X权限,然后./test.sh  执行,./是前路径和上边的点意思完全不一样。也可以用全路径代替 /root/test.sh 也可以执行

[root@VM_0_3_centos ~]# more test.sh 
#!/bin/bash
echo 'succ'
[root@VM_0_3_centos ~]# sh test.sh
succ
[root@VM_0_3_centos ~]# bash test.sh
succ
[root@VM_0_3_centos ~]# . test.sh
succ
[root@VM_0_3_centos ~]# source  test.sh
succ
[root@VM_0_3_centos ~]# ./test.sh
-bash: ./test.sh: Permission denied
[root@VM_0_3_centos ~]# ls -l test.sh
-rw-r--r-- 1 root root 24 Sep 20 11:11 test.sh
[root@VM_0_3_centos ~]# chmod o+x test.sh
[root@VM_0_3_centos ~]# ls -l test.sh
-rw-r--r-x 1 root root 24 Sep 20 11:11 test.sh
[root@VM_0_3_centos ~]# ./test.sh 
succ

上述三种演示完成之后,我们在实际工作中遇到最多问题都是处在第三种,就是为什么给了x权限,脚本还不能执行

主要原因如下:

第一。文件×权限是执行,目录X权限是进入,加入你写的脚本是放在/usr/local/shell/test.sh   这个路径下,虽然你test.sh当前用户有执行权限,但是假设他没有进入shell这一层目录权限,脚本肯定不能正常执行。总结就是,脚本每层目录当前用户都有进入权限+脚本有执行权限才可以正常执行。

第二 这种情况是很多用户最困惑的,脚本手动可以执行但是放到定时任务或者客户端调用就不行。举个例子,监控工具zabbix的客户端shell脚本,总获取不到数据。这时候是因为你手动执行是用的root,但是客户端进程执行时候,用的是自己创建的zabbix账户,所以就出现了,手动root执行没问题,放到客户端就不行怪事。因为zabbix账户可能连脚本里某些命令都调用不到。

所以,测试这种情况的时候,一定要切换到zabbix用户,在手动测试,查找问题。