当' file'是可执行的,
之间有什么区别kill 29871 ;
和
$ ./file
在Linux bash shell中?
答案 0 :(得分:3)
.
是source
的别名:它将在当前bash进程中执行作为其参数的文件,就像您直接在命令行中输入文件一样。
./file
只是提供文件的路径;在这种情况下,文件将根据文件的类型作为子进程启动,或者在文本文件的情况下作为hashbang启动。如果文件的第一行是#!/bin/bash
,它将作为新的bash进程启动它。
./
这里只是说文件在当前目录中。说cd /bin ; ./ls
和/bin/ls
没什么不同(显然我们将当前目录改为一个而不是另一个)。我们必须指定当前目录并且不能简单地给出文件名的原因是,如果没有指定目录,bash只在PATH中查找要执行的程序,并且当前目录通常不在类似Unix的PATH中系统。由于/bin
位于PATH中,因此简单ls
(通常)等同于/bin/ls
。
如果要定义变量,差异非常明显。任何环境变量仅适用于当前进程及其子进程;因此,如果在子进程中定义环境变量,则调用进程将无法访问它。
例如,假设您有一个名为testvar.sh
的文件:
#!/bin/bash
what=world
如果这样做,您将不会设置变量:
./testvar.sh ; echo Hello, $what
# => Hello,
但如果你这样做,你会:
. testvar.sh ; echo Hello, $what
# => Hello, world
另一个明显的区别是,由于.
执行bash命令,它只适用于包含bash脚本的文件。因此,cd /bin ; ./ls
将执行ls
程序;但是cd /bin ; . ls
会因错误而失败。