を使用できることは明らかです。
#!/usr/bin/perl
インタープリターを定義するスクリプトの最初の行のシバン表記。ただし、これはハッシュマークで始まる行をコメントとして無視するインタープリターを前提としています。この機能を持たないインタープリターをどのように使用できますか?
最初の行を削除し、ファイルの残りの部分で実際のインタープリターを呼び出すラッパーを使用します。次のようになります。
#!/bin/sh
# set your "real" interpreter here, or use cat for debugging
REALINTERP="cat"
tail -n +2 $1 | $REALINTERP
それ以外: 場合によっては、最初の行に関するエラー メッセージを無視することもできます。
最後の手段: インタープリターのコメント char のサポートをカーネルにコード化します。
最初の行はオペレーティング システムによって解釈されると思います。インタープリターが開始され、スクリプトの名前が最初のパラメーターとしてスクリプトに渡されます。次のスクリプト 'first.myint' は、以下の C プログラムからの実行可能ファイルであるインタープリター 'myinterpreter' を呼び出します。
#!/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!
私はそれを機能させました。ホルゲロのテールオピオントリックに特に感謝します
tail -n +2 $1 | $REALINTERP
それと、スタックオーバーフローに関するこの回答を見つけることで、次のことが可能になりました。
Linux シェル スクリプトをコンパイルして、スタンドアロンの実行可能 *バイナリ* (つまり、chmod 755 だけではない) にする方法は?
「私のニーズを完全に満たすソリューションは、無料のツールである SHC です」
SHC はシェルから C へのトランスレータです。こちらを参照してください。
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.x.c -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 で直接書くのは興味深いかもしれませんが、おそらくそれでは速くなりません。
だから、これはそれがどれほど簡単かです。どんなコメントでも歓迎します。