很明显,可以使用
#!/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中编写多段脚本可能会很有意思,但可能不会使它变得更快。
所以,这是多么简单。 我欢迎任何意见。