Multiline shebang

From Rosetta Code
Revision as of 03:00, 7 August 2011 by rosettacode>Kernigh (Add {{incorrect}} to 10 examples, because: "This is not a multiline shebang. A plain #! can only have one line.")
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

  1. | ... |# provides just the right environment for the multiline shebang. Here, the script name is passed 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

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

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

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

Lua

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

newLISP

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

Node.js

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

Perl

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

Python

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

R

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

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

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

A plain shebang will do.

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

Smalltalk

<lang smalltalk>"exec" "gst" "-f" "$0" "$0" "$@" "exit"</lang>

Tcl

This example is incorrect. Please fix the code and remove this message.

Details: This is not a multiline shebang. A plain #! can only have one line.

Note that the binary is tclsh.

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