学习日记

正在关注 Linux 、开源的个人博客。

首页 | 学习日记小店 | MobileMate | 标签云 | 留言本 | 登录 |

Linux执行shell脚本的方式

2016年05月15日 上午 10:47 | 作者:littlebat

这里简述 Linux 下 shell 脚本的几种执行方式。包括:直接执行, shell 命令执行, shell 内建 source 或 . 命令执行。

示例脚本如下 test.sh:
#!/bin/sh
[[ -n "noempty" ]] && echo “no empty” || echo “empty”
exit 0

1、
直接以绝对或相对路径执行,或在 PATH 环境变量的范围内不带路径执行。如:./test.sh 。

这里脚本本身必须加上可执行权限,chmod +x test.sh 。解释器以脚本头部的解释器标识行为准(#! ,shebang,sha-bang),这里是 /bin/sh,因为 sh 解释器没有 [[]] ,只有 [] 的用法,所以这个脚本是错的,不能执行成功。

2、
作为 shell 解释器命令的参数执行。如:sh ./test.sh 或 bash ./test.sh 。

这里脚本可以是去掉执行权限的,chmod -x test.sh 。解释器会忽略脚本头部的解释器标识行,以调用脚本的解释器命令为准。如执行 bash ./test.sh,脚本内容实际上是以 bash 为解释器执行的,因为 bash 里有 [[]] 的用法,所以这个脚本会被成功执行的。

另外,在以 bash 命令执行脚本时,如果脚本文件没有路径,则会先搜索当前目录,再搜索 PATH 环境变量。

3、
以 shell 内建 source 或 . 命令执行。如 source ./test.sh 或 . ./test.sh 。

这里脚本也是可以去掉执行权限的,chmod -x test.sh 。解释器会忽略脚本头部的解释器标识行,以当前运行的shell解释器命令执行,如果是在 bash shell 中这个脚本会被成功执行的。但与上面第 2 种方式不同的是,第 2 种方式会在当前 shell 中新生成一个子进程执行,而 source 命令或 . 命令直接在当前 shell 中执行脚本的内容,不会新生成子进程,所以上面脚本最后的 exit 0 命令也会直接在当前执行 source 命令的脚本中执行,导致当前脚本直接退出。

在以 bash 内建 source(.)或 sh 内建 . 命令执行脚本时,如果脚本文件没有路径,则会默认搜索 PATH 环境变量。

source 或 . 命令多用于在当前shell 中导入变量或库函数。相当于直接在 shell 中添加了 source 或 . 文件内的内容。

另,本文的环境为 Debian 8,bash 版本为 4.3,dash (sh) 版本为 0.5.7。其它的 shell 未一一验证。

以上内容参见: man bash, man sh。关于 source 内建命令的用法还可参见 Advanced Bash-Scripting Guide: http://www.tldp.org/LDP/abs/html/internal.html#SOURCEREF

版权所有。转载时必须以链接形式注明作者和原始出处及本声明。

相关日记

随机日记

添加到网摘

[del.icio.us]  [新浪 VIVI]  [365key]  [YouNote]  [博采中心]  [Poco]  [SOHU狐摘]  [天极网摘]  [和讯网摘] 

发表评论

*必填

*必填 (不会被公开)

重要! 你需要解答下面这道简单的算术题目继续(让我们知道你是一名人类):-)

2 + 10 = ?
请保持下列两个字段内容不变:

Copyright © 2004-2010 www.learndiary.com(学习日记)
Powered by WordPress with theme by UCDCHINA for Blogool come from JunChen Wu, nowa
联系版主:dashing.meng at gmail dot com。2004.7.25
遂公网安备51092202000173