Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to define script interpreter with shebang

Tags:

linux

bash

unix

sml

It is clear that one can use the

#!/usr/bin/perl

shebang notation in the very first line of a script to define the interpreter. However, this presupposes an interpreter that ignores hashmark-starting lines as comments. How can one use an interpreter that does not have this feature?

like image 641
Gergely Avatar asked Mar 27 '13 17:03

Gergely


People also ask

How do you use shebang in a script?

The shebang is a special character sequence in a script file that specifies which program should be called to run the script. The shebang is always on the first line of the file, and is composed of the characters #! followed by the path to the interpreter program.

Do you need shebang in shell script?

I strongly recommend you to never write neither run a shell script without a #! shebang! As we said, the shebang tells to the kernel which interpreter is to be used to run the commands present in the file.

Why do bash scripts start with #!/ Bin bash?

The “#!” combo is called a shebang by most Unix geeks. This is used by the shell to decide which interpreter to run the rest of the script, and ignored by the shell that actually runs the script.

What does #! Mean in script?

This is the first line of the script above. The hash exclamation mark ( #! ) character sequence is referred to as the Shebang. Following it is the path to the interpreter (or program) that should be used to run (or interpret) the rest of the lines in the text file.


2 Answers

With a wrapper that removes the first line and calls the real interpreter with the remainder of the file. It could look like this:

#!/bin/sh

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

tail -n +2 $1 | $REALINTERP

Other than that: In some cases ignoring the error message about that first line could be an option.

Last resort: code support for the comment char of your interpreter into the kernel.

like image 166
holgero Avatar answered Sep 18 '22 20:09

holgero


I think the first line is interpreted by the operating system. The interpreter will be started and the name of the script is handed down to the script as its first parameter. The following script 'first.myint' calls the interpreter 'myinterpreter' which is the executable from the C program below.

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

The sketch of the personal interpreter:

#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  ---------- */

Now call the script (made executable before) and see the output:

...~> ./first.myint
#!/usr/local/bin/myinterpreter
Skipped a comment!
2 xxxxxxxxxxx
333
444
Skipped a comment!
like image 39
Fritz G. Mehner Avatar answered Sep 20 '22 20:09

Fritz G. Mehner