#的局限!在脚本中

时间:2010-11-27 16:16:53

标签: scripting

好像是一个带#的脚本!前缀可以有解释器名称,只有一个参数。因此:

#!/bin/ls -l

有效,但

#!/usr/bin/env ls -l

你同意吗?有什么想法吗?

的Francesc

2 个答案:

答案 0 :(得分:2)

不同的Unix解释#!不同。这是一篇全面的文章:http://www.in-ulm.de/~mascheck/various/shebang/

似乎跨平台的最低共同点是“解释器(它本身不能是一个脚本)并且只有一个参数”。

答案 1 :(得分:-1)

最初,我们在Unix上只有一个shell。当您要求运行命令时,shell将尝试在其上调用其中一个exec()系统调用。命令是可执行文件,exec会成功,命令会运行。如果exec()失败,shell就不会放弃,而是尝试将命令文件解释为shell脚本。

然后unix获得了更多的炮弹,情况变得混乱。大多数人会在一个shell中编写脚本,在另一个shell中键入命令。每个shell都有不同的规则,可以将脚本提供给解释器。

这是“#! /“技巧被发明了。我们的想法是让内核的exec()系统调用使用shell脚本成功。当内核尝试执行exec()文件时,它会查看前4个字节,这些字节表示一个称为幻数的整数。这告诉内核是否应该尝试运行该文件。所以“#! /“被添加到内核知道的幻数中,并且它被扩展为实际上能够自己运行shell脚本。但是有些人不能输入“#! /“,他们不断离开这个空间。所以内核再次花了一点时间让“#!/”作为一个特殊的3字节幻数。