1 ./需要执行权限,使用脚本文件中第一行#!指定的shell(解释器)来执行命令(譬如常见的/bin/bash),不指定系统会调用默认shell程序
2 sh不需要执行权限,是使用sh这个shell执行命令,是个软链接,它可能是一个任意的shell,通常默认是bash shel,用type命令可以查看
3 shell的执行方式
先来看一个简单的shell脚本:
#!/bin/sh
cd /tmp
echo "hello,world!"
我们来挨个解释一下脚本的每一行:
第一行:#!后面跟的是解释器的路径(shell本身就是一种解释型语言),解释器的路径是/bin/sh;
第二行:cd命令是切换当前工作目录的命令,tep是linux下根目录的一个子目录;
第三行:echo命令是输出后面所跟的参数
三种执行方法:
第一种:因为shell程序写完之后并没有执行权限,所以该脚本想要执行可以使用chmod命令赋予该脚本可执行的权限,然后再执行。
[root@localhost shell]# chmod +x echo.sh
[root@localhost shell]# ./echo.sh
hello,world!
[root@localhost shell]# pwd
/root/shell
[root@localhost shell]#
第二种:调用解释器使得脚本执行,例如:bash、csh、csh、ash、bsh、ksh等等;
[root@localhost shell]# sh echo.sh
hello,world!
[root@localhost shell]# bash echo.sh
hello,world![root@localhost shell]# pwd/root/shell
第三种:使用source命令;
root@localhost shell]# source echo.sh
hello,world!
[root@localhost tmp]# pwd
/tmp
细心的读者可能发现了一个问题:在脚本的第一行有cd命令,这是一个改变工作目录的命令,可是使用第一种和第二种放大执行脚本后当前的工作目录并没有改变(脚本所在的目录是shell文件夹,脚本执行后,使用pwd命令显示出当前的工作目录还是shell),使用第三种方法执行后当前的工作目录就改变了,进入了tmp中。出现这种情况是系统本身执行脚本的方式不同所造成的!
前两种方法执行脚本时系统会创建一个子进程或者说子shell来执行脚本,原来的进程就是父进程或者说父shell,整个过程中父进程会等待子进程执行完毕,然后子进程退出,父进程也退出。cd命令确实被执行了,但是仅仅是在子进程中改变了工作目录,所以脚本执行完后使用pwd显示工作目录并没有改变。而第三种方法执行的shell脚本的话并不创建子进程,就是在原来的进程中执行,所以最后的工作目录改变了