如何用shebang定义脚本解释器

很明显,可以使用

#!/usr/bin/perl 

在一个脚本的第一行中定义了翻译符号。 但是,这预设了一个忽略哈希马克开始行作为评论的解释器。 如何使用一个没有这个function的解释器?

使用一个包装来删除第一行,并用文件的其余部分调用真正的解释器。 它可能是这样的:

 #!/bin/sh # set your "real" interpreter here, or use cat for debugging REALINTERP="cat" tail -n +2 $1 | $REALINTERP 

除此之外:在某些情况下,忽略有关第一行的错误消息可能是一个选项。

最后的手段:代码支持你的解释器的char注释到内核中。

我认为第一行是由操作系统解释的。 解释器将被启动,脚本的名字作为其第一个参数传递给脚本。 下面的脚本'first.myint'调用解释器'myinterpreter',它是下面C程序的可执行文件。

 #!/usr/local/bin/myinterpreter % 1 ######### 2 xxxxxxxxxxx 333 444 % the last comment 

个人口译员的草图:

 #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFERSIZE 256 /* input buffer size */ int main ( int argc, char *argv[] ) { char comment_leader = '%'; /* define the coment leader */ char *line = NULL; size_t len = 0; ssize_t read; // char buffer[BUFFERSIZE]; // argv[0] : the name of this executable // argv[1] : the name the script calling this executable via shebang FILE *input; /* input-file pointer */ char *input_file_name = argv[1]; /* the script name */ input = fopen( input_file_name, "r" ); if ( input == NULL ) { fprintf ( stderr, "couldn't open file '%s'; %s\n", input_file_name, strerror(errno) ); exit (EXIT_FAILURE); } while ((read = getline(&line, &len, input)) != -1) { if ( line[0] != comment_leader ) { printf( "%s", line ); /* print line as a test */ } else { printf ( "Skipped a comment!\n" ); } } free(line); if( fclose(input) == EOF ) { /* close input file */ fprintf ( stderr, "couldn't close file '%s'; %s\n", input_file_name, strerror(errno) ); exit (EXIT_FAILURE); } return EXIT_SUCCESS; } /* ---------- end of function main ---------- */ 

现在调用脚本(在之前创建可执行文件)并查看输出:

 ...~> ./first.myint #!/usr/local/bin/myinterpreter Skipped a comment! 2 xxxxxxxxxxx 333 444 Skipped a comment! 

我做了它的工作。 我特别感谢holgero的尾巴戏法

 tail -n +2 $1 | $REALINTERP 

那,并找到堆栈溢出这个答案使它成为可能:

如何编译一个Linux shell脚本成为一个独立的可执行文件*二进制*(即不只是如chmod 755)?

“完全满足我需求的解决方案将是SHC – 免费工具”

SHC是一个C语言翻译的shell,请看这里:

http://www.datsi.fi.upm.es/~frosal/

所以我写了polyscript.sh

 $ cat polyscript.sh #!/bin/bash tail -n +2 $1 | poly 

我用shc编译了这个,然后用gcc编译:

 $ shc-3.8.9/shc -f polyscript.sh $ gcc -Wall polyscript.sh.xc -o polyscript 

现在,我能够创建一个用ML写的第一个脚本:

 $ cat smlscript #!/home/gergoe/projects/shebang/polyscript $0 print "Hello World!" 

而且,我能够运行它:

 $ chmod u+x smlscript $ ./smlscript Poly/ML 5.4.1 Release > > # Hello World!val it = (): unit 

Poly没有压缩编译器输出的选项,但这不是问题。 按照fgm的建议直接在C中编写多段脚本可能会很有意思,但可能不会使它变得更快。

所以,这是多么简单。 我欢迎任何意见。