Multiline shebang

From Rosetta Code
Multiline shebang is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Simple shebangs can help with scripting, e.g. #!/usr/bin/env python at the top of a Python script will allow it to be run in a terminal as "./script.py".

Occasionally, a more complex shebang line is needed. For example, some languages do not include the program name in ARGV; a multiline shebang can reorder the arguments so that the program name is included in ARGV.

The syntax for a multiline shebang is complicated. The shebang lines must be simultaneously commented away from the main language and revealed to Bash so that they can be executed.

Chicken Scheme

The script name is passwed once to the Chicken Scheme Interpreter and once to be picked up in args.

<lang scheme>#!/bin/bash

  1. |

exec csi -ss $0 ${1+"$@"} exit |#</lang>

Clojure

The namespace = basename = filename minus the extension must be passed as a value to Clojure's -m flag.

<lang clojure>":";exec clj -m `basename $0 .clj` $0 ${1+"$@"} ":";exit</lang>

Common Lisp

Here, the script name is passed once to CLISP and once to ext:*args*, which normally omits it.

<lang lisp>#!/bin/bash

  1. |

exec clisp -q -q $0 $0 ${1+"$@"} exit |#</lang>

Emacs Lisp

<lang lisp>:;exec emacs -batch -l $0 -f main $*</lang>

Erlang

Note that the binary is escript, not erl. The latter refuses to compile or run code that contains a shebang.

<lang erlang>#!/usr/bin/env escript</lang>

Haskell

A plain shebang will do.

<lang haskell>#!/usr/bin/env runhaskell</lang>

Lua

A plain shebang will do.

<lang lua>#!/usr/bin/env lua</lang>

newLISP

A plain shebang will do.

<lang lisp>#!/usr/bin/env newlisp</lang>

Node.js

A plain shebang will do.

<lang javascript>#!/usr/bin/env node</lang>

Perl

A plain shebang will do.

<lang perl>#!/usr/bin/env perl</lang>

Python

A plain shebang will do.

<lang python>#!/usr/bin/env python</lang>

R

Note that the binary is Rscript, not the R interpreter. Regardless, scripts must end with q("no") in order to terminate and return to the shell.

<lang R>#!/usr/bin/env Rscript</lang>

Ruby

A plain shebang will do.

<lang ruby>#!/usr/bin/env ruby</lang>

Tcl

Note that the binary is tclsh.

<lang tcl>#!/usr/bin/env tclsh</lang>