In
computing
Computing is any goal-oriented activity requiring, benefiting from, or creating computer, computing machinery. It includes the study and experimentation of algorithmic processes, and the development of both computer hardware, hardware and softw ...
, a shebang is the character sequence , consisting of the characters
number sign
The symbol is known as the number sign, hash, (or in North America) the pound sign. The symbol has historically been used for a wide range of purposes including the designation of an ordinal number and as a Typographic ligature, ligatured abbre ...
(also known as sharp or hash) and
exclamation mark
The exclamation mark (also known as exclamation point in American English) is a punctuation mark usually used after an interjection or exclamation to indicate strong feelings or to show wikt:emphasis, emphasis. The exclamation mark often marks ...
(also known as bang), at the beginning of a
script. It is also called sharp-exclamation, sha-bang, hashbang, pound-bang, or hash-pling.
When a text file with a shebang is used as if it were an executable in a
Unix-like
A Unix-like (sometimes referred to as UN*X, *nix or *NIX) operating system is one that behaves in a manner similar to a Unix system, although not necessarily conforming to or being certified to any version of the Single UNIX Specification. A Uni ...
operating system, the
program loader mechanism parses the rest of the file's initial line as an
interpreter directive. The loader executes the specified
interpreter program, passing to it as an argument the path that was initially used when attempting to run the script, so that the program may use the file as input data.
For example, if a script is named with the path ''path/to/script'', and it starts with the line
#! /bin/sh
, then the program loader is instructed to run the program ''/bin/sh'', passing ''path/to/script'' as the first argument.
The shebang line is usually ignored by the interpreter, because the "#" character is a
comment marker in many scripting languages; some language interpreters that do not use the hash mark to begin comments still may ignore the shebang line in recognition of its purpose.
Syntax
The form of a shebang
interpreter directive is as follows:
#! ''interpreter''
'optional-one-arg-only''in which ''interpreter'' is a
path
A path is a route for physical travel – see Trail.
Path or PATH may also refer to:
Physical paths of different types
* Bicycle path
* Bridle path, used by people on horseback
* Course (navigation), the intended path of a vehicle
* Desir ...
to an executable program. The space between and ''interpreter'' is optional. There could be any number of spaces or tabs either before or after ''interpreter''. The ''optional-arg'' will include any extra spaces up to the end-of-line.
In
Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
, the file specified by ''interpreter'' can be executed if it has the execute rights and is one of the following:
* a native executable, such as an
ELF
An elf (: elves) is a type of humanoid supernatural being in Germanic peoples, Germanic folklore. Elves appear especially in Norse mythology, North Germanic mythology, being mentioned in the Icelandic ''Poetic Edda'' and the ''Prose Edda'' ...
binary
* any kind of file for which an interpreter was registered via the
binfmt_misc mechanism (such as for executing Microsoft
.exe binaries using
wine
Wine is an alcoholic drink made from Fermentation in winemaking, fermented fruit. Yeast in winemaking, Yeast consumes the sugar in the fruit and converts it to ethanol and carbon dioxide, releasing heat in the process. Wine is most often made f ...
)
* another script starting with a shebang
On Linux and
Minix, an interpreter can also be a script. A chain of shebangs and wrappers yields a directly executable file that gets the encountered scripts as parameters in reverse order. For example, if file ''/bin/A'' is an executable file in
ELF
An elf (: elves) is a type of humanoid supernatural being in Germanic peoples, Germanic folklore. Elves appear especially in Norse mythology, North Germanic mythology, being mentioned in the Icelandic ''Poetic Edda'' and the ''Prose Edda'' ...
format, file ''/bin/B'' contains the shebang , and file ''/bin/C'' contains the shebang , then executing file ''/bin/C'' resolves to , which finally resolves to .
In
Solaris- and
Darwin-derived operating systems (such as
macOS
macOS, previously OS X and originally Mac OS X, is a Unix, Unix-based operating system developed and marketed by Apple Inc., Apple since 2001. It is the current operating system for Apple's Mac (computer), Mac computers. With ...
), the file specified by ''interpreter'' must be an executable binary and cannot itself be a script.
Examples
Some typical shebang lines:
*
#! /bin/sh
– Execute the file using the
Bourne shell
The Bourne shell (sh) is a shell command-line interpreter for computer operating systems. It first appeared on Version 7 Unix, as its default shell. Unix-like systems continue to have /bin/sh—which will be the Bourne shell, or a symbolic lin ...
, or a compatible shell, assumed to be in the /bin directory
*
#! /bin/bash
– Execute the file using the
Bash shell
*
#! /usr/bin/pwsh
– Execute the file using
PowerShell
PowerShell is a shell program developed by Microsoft for task automation and configuration management. As is typical for a shell, it provides a command-line interpreter for interactive use and a script interpreter for automation via a langu ...
*
#! /usr/bin/env python3
– Execute with a
Python interpreter, using the
env program search path to find it
*
#! /bin/false
– Do nothing, but return a non-zero
exit status
In computing, the exit status (also exit code or exit value) of a terminated process is an integer number that is made available to its parent process (or caller). In DOS, this may be referred to as an errorlevel.
When computer programs ar ...
, indicating failure. Used to prevent stand-alone execution of a script file intended for execution in a specific context, such as by the
.
command from sh/bash,
source
from csh/tcsh, or as a .profile, .cshrc, or .login file.
Shebang lines may include specific options that are passed to the interpreter. However, implementations vary in the parsing behavior of options; for portability, only one option should be specified without any embedded whitespace.
Further portability guidelines are found below.
Purpose
Interpreter directives allow scripts and data files to be used as commands, hiding the details of their implementation from users and other programs, by removing the need to prefix scripts with their interpreter on the command line.
For example, consider a script having the initial line
#! /bin/sh -x
. It may be invoked simply by giving its file path, such as
some/path/to/foo
, and some parameters, such as
bar
and
baz
:
some/path/to/foo bar baz
In this case
/bin/sh
is invoked in its place, with parameters
-x
,
some/path/to/foo
,
bar
, and
baz
, as if the original command had been
/bin/sh -x some/path/to/foo bar baz
Most interpreters make any additional arguments available to the script. If
/bin/sh
is a
POSIX-compatible shell, then
bar
and
baz
are presented to the script as the positional parameter array
"$@"
, and individually as parameters
"$1"
and
"$2"
respectively.
Because the initial
# is the character used to introduce comments in the
POSIX shell language (and in the languages understood by many other interpreters), the whole shebang line is ignored by the interpreter. However, it is up to the interpreter to ignore the shebang line, and not all do so; thus, a script consisting of the following two lines simply outputs ''both'' lines when run:
#! /bin/cat
Hello world!
Strengths
When compared to the use of global association lists between file extensions and the interpreting applications, the interpreter directive method allows users to use interpreters not known at a global system level, and without administrator rights. It also allows specific selection of interpreter, without overloading the
filename extension
A filename extension, file name extension or file extension is a suffix to the name of a computer file (for example, .txt, .mp3, .exe) that indicates a characteristic of the file contents or its intended use. A filename extension is typically d ...
namespace
In computing, a namespace is a set of signs (''names'') that are used to identify and refer to objects of various kinds. A namespace ensures that all of a given set of objects have unique names so that they can be easily identified.
Namespaces ...
(where one file extension refers to more than one file type), and allows the implementation language of a script to be changed without changing its invocation syntax by other programs. Invokers of the script need not know what the implementation language is as the script itself is responsible for specifying the interpreter to use.
Portability
Program location
Shebangs must specify
absolute paths (or paths relative to current working directory) to system executables; this can cause problems on systems that have a non-standard file system layout. Even when systems have fairly standard paths, it is quite possible for variants of the same operating system to have different locations for the desired interpreter.
Python, for example, might be in ''/usr/bin/python3'', ''/usr/local/bin/python3'', or even something like ''/home/username/bin/python3'' if installed by an ordinary user.
A similar problem exists for the
POSIX shell, since POSIX only required its name to be ''sh'', but did not mandate a path. A common value is , but some systems such as Solaris have the POSIX-compatible shell at ''/usr/xpg4/bin/sh''. In many
Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
systems, ''/bin/sh'' is a hard or
symbolic link
In computing, a symbolic link (also symlink or soft link) is a file whose purpose is to point to a file or directory (called the "target") by specifying a path thereto.
Symbolic links are supported by POSIX and by most Unix-like operating syste ...
to ''/bin/bash'', the
Bourne Again shell (BASH). Using bash-specific syntax while maintaining a shebang pointing to ''sh'' is also not portable.
Because of this it is sometimes required to edit the shebang line after copying a
script from one computer to another because the path that was coded into the script may not apply on a new machine, depending on the consistency in past convention of placement of the interpreter. For this reason and because
POSIX
The Portable Operating System Interface (POSIX; ) is a family of standards specified by the IEEE Computer Society for maintaining compatibility between operating systems. POSIX defines application programming interfaces (APIs), along with comm ...
does not standardize path names, POSIX does not standardize the feature. The
GNU Autoconf tool can test for system support with the macro AC_SYS_INTERPRETER.
Often, the program can be used to circumvent this limitation by introducing a level of
indirection. is followed by , followed by the desired command without full path, as in this example:
#!/usr/bin/env sh
This mostly works because the path is commonly used for the utility, and it invokes the first found in the user's
$PATH, typically .
This particular example (using ) is of limited utility: neither nor is universal, with similar numbers of devices lacking each. More broadly using for any script still has some portability issues with
OpenServer 5.0.6 and
Unicos 9.0.2 which have only and no .
Using results in ''run-time'' indirection, which has the potential to degrade system security; for this reason some commentators recommend against its use in packaged software, reserving it only for "educational examples".
Argument splitting
Command arguments are split in different ways across platforms.
Some systems do not split up the arguments; for example, when running the script with the first line,
#!/usr/bin/env python3 -c
all text after the first space is treated as a single argument, that is, will be passed as one argument to , rather than two arguments. Such systems include Linux and
Cygwin.
Another approach is the use of a
wrapper. FreeBSD 6.0 (2005) introduced a option to its as it changed the shebang-reading behavior to non-splitting. This option tells to split the string itself. The GNU utility since
coreutils
The GNU Core Utilities or coreutils is a collection of GNU software that implements many standard, Unix-based shell commands. The utilities generally provide POSIX compliant interface when the environment variable is set, but otherwise offers ...
8.30 (2018) also includes this feature. Although using this option mitigates the portability issue on the kernel end with splitting, it adds the requirement that supports this particular extension.
Character interpretation
Another problem is scripts containing a
carriage return character immediately after the shebang line, perhaps as a result of being edited on a system that uses DOS
line breaks, such as
Microsoft Windows
Windows is a Product lining, product line of Proprietary software, proprietary graphical user interface, graphical operating systems developed and marketed by Microsoft. It is grouped into families and subfamilies that cater to particular sec ...
. Some systems interpret the carriage return character as part of the
interpreter command, resulting in an error message.
Magic number
The shebang is actually a human-readable instance of a
magic number in the executable file, the
magic byte string being , the two-character encoding in
ASCII
ASCII ( ), an acronym for American Standard Code for Information Interchange, is a character encoding standard for representing a particular set of 95 (English language focused) printable character, printable and 33 control character, control c ...
of . This magic number is detected by the "
exec" family of functions, which determine whether a file is a script or an executable binary. The presence of the shebang will result in the execution of the specified executable, usually an interpreter for the script's language. It has been claimed that some old versions of Unix expect the normal shebang to be followed by a space and a slash ('), but this appears to be untrue;
rather, blanks after the shebang have traditionally been allowed, and sometimes documented with a space, as described in the
1980 historical email below.
The shebang characters are represented by the same two bytes in
extended ASCII
Extended ASCII is a repertoire of character encodings that include (most of) the original 96 ASCII character set, plus up to 128 additional characters. There is no formal definition of "extended ASCII", and even use of the term is sometimes critic ...
encodings, including
UTF-8
UTF-8 is a character encoding standard used for electronic communication. Defined by the Unicode Standard, the name is derived from ''Unicode Transformation Format 8-bit''. Almost every webpage is transmitted as UTF-8.
UTF-8 supports all 1,112,0 ...
, which is commonly used for scripts and other text files on current Unix-like systems. However, UTF-8 files may begin with the optional
byte order mark (BOM); if the "exec" function specifically detects the bytes and , then the presence of the BOM () before the shebang will prevent the script interpreter from being executed. Some authorities recommend against using the byte order mark in
POSIX
The Portable Operating System Interface (POSIX; ) is a family of standards specified by the IEEE Computer Society for maintaining compatibility between operating systems. POSIX defines application programming interfaces (APIs), along with comm ...
(Unix-like) scripts,
for this reason and for wider interoperability and philosophical concerns. Additionally, a byte order mark is not necessary in UTF-8, as that encoding does not have
endianness
file:Gullivers_travels.jpg, ''Gulliver's Travels'' by Jonathan Swift, the novel from which the term was coined
In computing, endianness is the order in which bytes within a word (data type), word of digital data are transmitted over a data comm ...
issues; it serves only to identify the encoding as UTF-8.
Etymology
An executable file starting with an interpreter directive is simply called a script, often prefaced with the name or general classification of the intended interpreter. The name ''shebang'' for the distinctive two characters may have come from an inexact
contraction of ''
SHArp bang'' or ''haSH bang'', referring to the two typical Unix names for them. Another theory on the ''sh'' in ''shebang'' is that it is from the default shell ''sh'', usually invoked with shebang. This usage was current by December 1989, and probably earlier.
History
The shebang was introduced by
Dennis Ritchie
Dennis MacAlistair Ritchie (September 9, 1941 – October 12, 2011) was an American computer scientist. He created the C programming language and the Unix operating system and B language with long-time colleague Ken Thompson. Ritchie and Thomp ...
between
Edition 7 and
8 at Bell Laboratories. It was also added to the
BSD
The Berkeley Software Distribution (BSD), also known as Berkeley Unix or BSD Unix, is a discontinued Unix operating system developed and distributed by the Computer Systems Research Group (CSRG) at the University of California, Berkeley, beginni ...
releases from Berkeley's Computer Science Research (present at 2.8BSD
and activated by default by 4.2BSD). As AT&T Bell Laboratories Edition 8 Unix, and later editions, were not released to the public, the first widely known appearance of this feature was on BSD.
The lack of an interpreter directive, but support for shell scripts, is apparent in the documentation from
Version 7 Unix
Version 7 Unix, also called Seventh Edition Unix, Version 7 or just V7, was an important early release of the Unix operating system. V7, released in 1979, was the last Bell Laboratories release to see widespread distribution before the commerc ...
in 1979, which describes instead a facility of the Bourne shell where files with execute permission would be handled specially by the shell, which would (sometimes depending on initial characters in the script, such as ":" or "#") spawn a subshell which would interpret and run the commands contained in the file. In this model, scripts would only behave as other commands if called from within a Bourne shell. An attempt to directly execute such a file via the operating system's own
''exec()'' system call would fail, preventing scripts from behaving uniformly as normal system commands.
Version 8 improved shell scripts
In later versions of Unix-like systems, this inconsistency was removed.
Dennis Ritchie
Dennis MacAlistair Ritchie (September 9, 1941 – October 12, 2011) was an American computer scientist. He created the C programming language and the Unix operating system and B language with long-time colleague Ken Thompson. Ritchie and Thomp ...
introduced kernel support for interpreter directives in January 1980, for
Version 8 Unix, with the following description:
From uucp Thu Jan 10 01:37:58 1980
>From dmr Thu Jan 10 04:25:49 1980 remote from research
The system has been changed so that if a file being executed
begins with the magic characters #! , the rest of the line is understood
to be the name of an interpreter for the executed file.
Previously (and in fact still) the shell did much of this job;
it automatically executed itself on a text file with executable mode
when the text file's name was typed as a command.
Putting the facility into the system gives the following
benefits.
1) It makes shell scripts more like real executable files,
because they can be the subject of 'exec.'
2) If you do a 'ps' while such a command is running, its real
name appears instead of 'sh'.
Likewise, accounting is done on the basis of the real name.
3) Shell scripts can be
set-user-ID.
4) It is simpler to have alternate shells available;
e.g. if you like the Berkeley csh there is no question about
which shell is to interpret a file.
5) It will allow other interpreters to fit in more smoothly.
To take advantage of this wonderful opportunity,
put
#! /bin/sh
at the left margin of the first line of your shell scripts.
Blanks after ! are OK. Use a complete pathname (no search is done).
At the moment the whole line is restricted to 16 characters but
this limit will be raised.
Unnamed shell script feature
The feature's creator didn't give it a name, however:
From: "Ritchie, Dennis M (Dennis)** CTR **" edacted
To: < edactedtalisman.org>
Date: Thu, 19 Nov 2009 18:37:37 -0600
Subject: RE: What do -you- call your #! line?
I can't recall that we ever gave it a proper name.
It was pretty late that it went in--I think that I
got the idea from someone at one of the UCB conferences
on Berkeley Unix; I may have been one of the first to
actually install it, but it was an idea that I got
from elsewhere.
As for the name: probably something descriptive like
"hash-bang" though this has a specifically British flavor, but
in any event I don't recall particularly using a pet name
for the construction.
Kernel support for interpreter directives spread to other versions of Unix, and one modern implementation can be seen in the Linux kernel source in ''fs/binfmt_script.c''.
This mechanism allows scripts to be used in virtually any context normal compiled programs can be, including as full system programs, and even as interpreters of other scripts. As a caveat, though, some early versions of kernel support limited the length of the interpreter directive to roughly 32 characters (just 16 in its first implementation), would fail to split the interpreter name from any parameters in the directive, or had other quirks. Additionally, some modern systems allow the entire mechanism to be constrained or disabled for security purposes (for example, set-user-id support has been disabled for scripts on many systems).
Note that, even in systems with full kernel support for the ''#!''
magic number, some scripts lacking interpreter directives (although usually still requiring execute permission) are still runnable by virtue of the legacy script handling of the Bourne shell, still present in many of its modern descendants. Scripts are then interpreted by the user's default shell.
See also
*
binfmt_misc
*
CrunchBang Linux
*
File association
*
URI fragment
Notes
References
{{Reflist, 30em
External links
Details about the shebang mechanism on various Unix flavours(a more generic approach)
FOLDOC shebang article
Unix