Multiline shebang: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
(Added Smalltalk)
Line 77: Line 77:


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

=={{header|Smalltalk}}==
Warning: Because quotes surround $*, the rest of the command line arguments are concatenated into a single argument.

Fortunately, this is easy to undo by splitting them again manually.

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


=={{header|Tcl}}==
=={{header|Tcl}}==

Revision as of 16:30, 6 August 2011

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

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>

Smalltalk

Warning: Because quotes surround $*, the rest of the command line arguments are concatenated into a single argument.

Fortunately, this is easy to undo by splitting them again manually.

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

Tcl

Note that the binary is tclsh.

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