目录
1、执行脚本test.sh
脚本test.sh内容:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
1.1、执行./test.sh
屏幕输出为:
[hadoop@shizhan ~]$sh ./test.sh
./test.sh: line 2: pcy.sh: No such file or directory
由此可见
#!/bin/sh
的情况下,source不成功,不会运行source后面的代码。
1.2、执行./test.sh
修改test.sh脚本的第一行,变为#!/bin/bash
,再次执行./ test.sh
#!/bin/bash
source pcy.sh #pcy.sh并不存在
echo hello
屏幕输出为:
[hadoop@shizhan ~]$sh ./test.sh
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可见
#!/bin/bash
的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
1.3、运行sh ./test.sh
这次屏幕输出为:
[hadoop@shizhan ~]$sh ./test.sh
./test.sh: line 2: pcy.sh: No such file or directory
表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。
1.4、为什么会有这样的区别呢?
sh一般设成bash的软链
[work@zjm-testing-app46 cy]$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
- 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
- 也就是说 /bin/sh 相当于 /bin/bash --posix
所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别
so,可以预想的是,如果第一行写成 #!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)
2、sh ./test.sh和./test.sh 执行脚本区别
2.1、linux运行shell的几种方式:
./test.sh 或 /root/test.sh
当没有配置在环境变量(PATH)中时,用这种方式。
./ 表示在当前目录下执行脚本。
sh ./test.sh 或 sh test.sh
当没有./ 权限的时候,用这种方式。
把test.sh 交给 bash去处理,不用权限,也不用 #!/bin/bash
头
其他
sh绝对路径下的.sh文件无效,但是cd到目录,再sh可以
这样启动无效:
sh /data/web/custom/current/startup.sh;
这样启动有效:
cd /data/web/custom/current;
sh startup.sh;
后来终于发现了问题的所在,current是个软连接,指向其他的地址。
因此:直接用绝对路径肯定找不到这个文件。
但是先cd的话,会到软连接对应的实际地址,再sh是可以的。
3、~、“/”和“./”的含义
~ 代表的就是自己的家目录: /Users/lihe
/
是指根目录:就是所有目录最顶层的目录。
./
表示当前目录,./ 一般需要和其他文件夹或者文件结合使用,指代当前目录下的东西。