Answers:
如果未提供魔术线,则使用默认外壳程序运行脚本。此默认Shell可以是Bourne Shell(sh),在某些版本中就是这种情况,但是,在某些其他版本中,所使用的默认Shell与执行它的登录Shell相同。关键是:不要将其留给系统来决定外壳,始终在第一行中提供所需的外壳。
/bin/sh
,而只是成为sh
探索一致PATH时发现的第一个可执行文件。
当您执行程序时,内核会检查它是否以某种魔术字节序列开始。如果可执行文件以开头#!
,则内核会将其余行解释为解释器名称。如果可执行文件以\177ELF
(\177
以127字节为开头)开头,则它将文件作为ELF可执行文件加载;如今,这是大多数Unix系统上的正常类型。
如果内核无法识别文件格式,则它拒绝执行文件并返回错误ENOEXEC(执行格式错误)。当shell注意到这一点时,它将自己作为shell脚本执行程序。
为了证明这一点,请在脚本中添加一些命令:
ps l $$
ls -l /proc/$$/exe
echo hello
(这是针对Linux的,请针对其他unice进行调整。)然后尝试从各种shell运行该脚本。您会看到一些shell生成了自己的新实例来执行脚本(bash,ksh93),而另一些则生成了/bin/sh
(dash,pdksh,zsh)。
ls -l
命令寻找什么?这:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-?如果是这样,它怎么说?另外,请注意我已经SHELL=/bin/bash
启用env
,但是更改它似乎并没有改变行为。也许是无关的?
ls -l /proc/$$/exe
实际上我应该写过)。该exe
链接指向负责执行脚本的外壳。运行脚本时,您会看到解释脚本的是bash。如果从例如pdksh运行它,它将运行/bin/sh
。SHELL
在这种情况下,我不知道任何使用环境变量的外壳程序或登录外壳程序。
/etc/passwd
更改通过SSH或在文本控制台上登录时执行的外壳。它不会更改哪个外壳程序可以执行脚本。
/etc/passwd
shell都不用决定使用哪个shell,它们要么派生自己的实例,要么执行/bin/sh
。
它可能是以下三种可能性之一:
您正在直接使用解释器IE调用脚本:bash script.sh
脚本文件的名称带有.sh扩展名,它使系统可以查找此类文件的默认程序。
因为我只能猜测脚本文件是可执行的,所以您正在使用的shell环境正在单独执行“ echo”。例如,如果您将使用bash shell并且在文件中有仅由ksh使用的命令,那么您将看到它将不起作用。
祝好运!