问题描述
有下面一段 shell 脚本
ubuntu>echo xxx.sh
#!/bin/bash
echo 'hello world'
ubuntu>chmod a+x xxx.sh
ubnutu>./xxx.sh
当输入 ./xxx.sh` 回车后,发生了什么?
问题分析
这里涉及到 bash 脚本的执行过程。其实我们在命令行中数据只是一个一个的字符串,这些字符串会交给 bash 程序处理。
- 先检查 alias(别名)配置中是否有对应的命令别名。如果命令别名存在,则执行,否则执行 2 .
- 查询内建命令,如果内建命令中存在,则执行,否则执行 3 .
- 在 PATH 路径中查找命令,如果 PATH 路径中找到了,则执行,否则保存,-bash:某某命令: command not found
扩展
- 如何查看命令的类型——也就是如何判断一个命令是 alias 别名还是内建命令还是PATH 里面配置的命令。
- 大家都知道,在 Linux 中式没有文件后缀名字的,那么 Linux 如何区分文件类型的呢?记住
there is shell , there is way
,这就是 file 命令。
从 man type 中可以看到命令可以分问四类:
- alias
- keyword
- function
- builtin
请看:
[centos]$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
-a
选项会从 alias shell-builtin PATH 中全部找出来。
file 会按照 systemfile test/magic test/language test 的顺序检测文件类型。
所以我们在写脚本的时候最好在最前面加上:
#!/bin/bash
shell 脚本的三种调用方式
调用 shell 脚本有三种方式:
- ./xxx.sh
- bash xxx.sh or sh xxx.sh
- . xxx.sh or source xxx.sh
shell 脚本的执行方式 | shell 文件是否需要执行权限 | 是否启动新的进程 |
---|---|---|
./xxx.sh | 是 | 是 |
. xxx.sh or source xxx.sh | 是 | 否 |
bash xxx.sh or sh xxx.sh | 否 | 是 |