7

を使用できることは明らかです。

#!/usr/bin/perl

インタープリターを定義するスクリプトの最初の行のシバン表記。ただし、これはハッシュマークで始まる行をコメントとして無視するインタープリターを前提としています。この機能を持たないインタープリターをどのように使用できますか?

4

3 に答える 3

4

最初の行を削除し、ファイルの残りの部分で実際のインタープリターを呼び出すラッパーを使用します。次のようになります。

#!/bin/sh

# set your "real" interpreter here, or use cat for debugging
REALINTERP="cat"

tail -n +2 $1 | $REALINTERP

それ以外: 場合によっては、最初の行に関するエラー メッセージを無視することもできます。

最後の手段: インタープリターのコメント char のサポートをカーネルにコード化します。

于 2013-03-27T21:55:31.680 に答える
3

最初の行はオペレーティング システムによって解釈されると思います。インタープリターが開始され、スクリプトの名前が最初のパラメーターとしてスクリプトに渡されます。次のスクリプト '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!
于 2013-03-27T20:09:32.620 に答える
1

私はそれを機能させました。ホルゲロのテールオピオントリックに特に感謝します

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 で直接書くのは興味深いかもしれませんが、おそらくそれでは速くなりません。

だから、これはそれがどれほど簡単かです。どんなコメントでも歓迎します。

于 2013-03-29T09:00:47.527 に答える