2012-01-26 414 views
4

什么样#。/和#之间的区别。 ./

# ./test 

# . ./test 

测试执行脚本之间的差异,例如

#!/bin/bash 
export OWNER_NAME="ANGEL 12" 
export ALIAS="angelique" 

简单的脚本,我知道结果,但即时通讯不能确定到底发生了什么

谢谢

+0

我不知道你可以做#。 ./blah。好的提示。 :) – vhallac

+0

怎么样? '#'应该是一个评论,背后的一切都应该被忽略!除了文件开头的'#!'外。 – TMS

回答

7

./foo执行foo如果它被标记为可执行文件且具有合适的shebang行(或者是ELF二进制文件)。它将在一个新的过程中执行。

. ./foo. foo加载在当前外壳脚本。它等于source foo

在示例代码中,如果希望导出的变量在shell中可用,则需要使用第二种方法。

+0

为什么不在第一个场景中导出环境变量..?即时通讯仍然困惑.. – user1127747

+0

@ user1127747:看到的问题[一个shell脚本可以设置调用shell的环境变量?](http://stackoverflow.com/questions/496702/can-a-shell-script-set-environment - 调用shell的变量)作为答案。 – DarkDust

+1

@ user1127747:由于脚本在其自己的进程中运行,因此无法将*回*导出到其父环境。这不仅仅是环境变量的工作原理。通过源代码(孤立点),您可以保留在shell的进程中,因此可以自由地更改其环境。 – unwind

2

仅使用点,bash就是“采购”指定文件。它等同于内建的source,并尝试在同一个shell进程中包含并执行脚本。

./启动一个新进程,并且当前shell进程等待它终止。

+3

'。/'表示*在当前目录*中。它是一个文件路径元素,而不是bash语法元素,不会产生子shell。 – DarkDust

+0

@DarkDust:这可能是不准确的,我只是想概括一下调用脚本而不用源代码的情况。 –

0

第一个暗示脚本(或二进制)是可执行的。用脚本(可能)包含一个shebang行来告诉使用哪个解释器。

第二个是“执行[参数]作为shell脚本”的缩写。作为参数传递的文件不需要设置可执行位。