我们平时写好一个**.sh脚本,根据每个人的习惯不同,运行脚本的方式也不相同,有人会用./**..sh或者root/abc/**.sh,有人会用sh **.sh, 还有可能用 source **.sh, 那么这些运行方式有什么不同,又有什么需要注意的呢,以下分别进行讲述:
./**.sh /root/abc/**.sh(即绝对路径的执行方式),这两种方式在执行前都需要被执行的文件具备可执行的属性
./**.sh
这种方式执行脚本是在当前目录下执行脚本,如果在某一个目录下不加./有可能脚本会运行不成功,因为如果当前工作目录不在执行程序默认的搜索路径的话就会找不脚本,
如我在/root 路径下有一个fwupdate.sh的脚本,当$PATH 如下:
[root@localhost ~]# echo $PATH
bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
直接执行fwupdate.sh脚本会报错
[root@localhost ~]# fwupdatetest.sh
-bash: fwupdatetest.sh: command not found
如果修改$PATH为:/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root,
则命令可以正常执行
[root@localhost ~]# fwupdatetest.sh
spawn /root/wangw33/spdk/examples/nvme/nvme_manage/nvme_manage
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 1 on socket 0
EAL: Detected lcore 2 as core 0 on socket 0
EAL: Detected lcore 3 as core 1 on socket 0
。。。。。。
2.绝对路径的执行方式–直接执行即可
[root@localhost ~]# /root/fwupdatetest.sh
spawn /root/wangw33/spdk/examples/nvme/nvme_manage/nvme_manage
EAL: Detected lcore 0 as core 0 on socket 0 EAL: Detected lcore 1 as core 1 on socket 0
EAL: Detected lcore 2 as core 0 on socket 0
sh **.sh 或者 source **.sh时不需要改变被执行文件的属性就可以执行脚本,这两个执行的本质是调用,是sh(bash)调用**.sh,**.sh是作为参数传给sh(bash)命令的,不是自己执行自己,所以不需要可执行的权限这两者的区别如下:
3. sh *.sh的执行方式执行被执行文件时会启动一个子进程执行被执行文件
4. source **.sh(. **.sh)的执行方式在执行被执行文件时是在父进程中执行的,不会另外启动一个子进程,是否启动子程序的区别在于该可执行文件是否可以使用父进程的变量
如以下hello.sh的执行文件,用sh 与 source执行的结果的差异如下,cd 是内建命令,在子程序中是不能使用的
[root@localhost home]# cd /root/
[root@localhost ~]#vim hello.sh
#! /bin/bash
cd /tmp
echo "hello guys!"
echo "welcome to my Blog:linuxboy.org!"
[root@localhost ~]# sh hello.sh
hello guys!
welcome to my Blog:linuxboy.org!
[root@localhost ~]# pwd
/root
[root@localhost ~]# source hello.sh
hello guys!
welcome to my Blog:linuxboy.org!
[root@localhost tmp]# pwd
/tmp
特殊说明:如果在一个脚本中预设的bash路径为“#!/usr/bin/expect”可否用sh 或者source执行呢,当然不可以,因为如果用bash或者source那么执行的路径就是bash啦,expect的语法就不会被识别了,会如下类似的想象
[root@localhost ~]# source fwupdatetest.sh
-bash: proc: command not found
couldn't read file "NVMe": no such file or directory
-bash: send: command not found
couldn't read file "domain:bus:dev.func": no such file or directory
-bash: send: command not found
couldn't read file "Image": no such file or directory
-bash: send: command not found
couldn't read file "Slot": no such file or directory
-bash: send: command not found
couldn't read file "menu": no such file or directory
-bash: send: command not found