0%

source命令

如题

  nginx的configure脚本中有用到have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define这样的命令,中间的“.”是个什么意思?

  在用终端的时候,如果在~/.bashrc中设置了一些终端参数后不想重新登录而让配置生效,比如设置了alias vi='vim',只需要这样source ~/.bashrc一下就能让当前shell使用新的配置,source命令是干嘛的?

  其实上面nginx中的“.”就是source命令,而source命令是bash的内置命令,它的作用是在当前shell环境中读取文件中的命令并执行。这里边有两点:1)是在当前shell环境执行文件中的命令,而不是像./xxx.sh或是sh xxx.sh这样在当前shell派生出的子shell中执行。2)是文件中都应该是shell可执行的命令,也就是说source会把文件中的文本都当成shell命令来执行。

  同样是执行命令,source跟./xxx.shsh xxx.sh有什么不同呢?最大的不同就是前者在文件中设置的变量对当前shell是可见的,而后者设置的变量对当前shell是不可见的。要知道./xxx.shsh xxx.sh都是在当前shell的子shell中执行的,子shell中的变量不会影响父shell,而source是把文件中的命令都读出来一个个执行,所有的变量其实就是在父shell中设置的。比如说如下的一个xxx.sh文件:

1
2
3
#!/bin/sh

test = "hello world"
  1. 执行./xxx.shsh xxx.sh
  2. echo $test,发现为空
  3. 执行source xxx.sh. xxx.sh
  4. echo $test,可以看到test的值在当前shell中是存在的

参考:

  1. Bash-Builtins: source
  2. [Linux Source命令及脚本的执行方式解析](http://www.51testing.com/html/38/225738-206878.html)