Last active
June 2, 2018 20:16
-
-
Save zealfire/5a40da9132e5754f6f31e9d7716c8151 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
source is a bash shell built-in command that executes the content of the file passed as argument, in the current shell. It has a synonym in . (period). | |
Be careful! ./ and source are not quite the same. | |
./script runs the script as an executable file, launching a new shell to run it | |
source script reads and executes commands from filename in the current shell environment | |
Note: ./script is not . script, but . script == source script | |
What is sh | |
sh (or the Shell Command Language) is a programming language described by the POSIX standard. It has many implementations (ksh88, dash, ...). bash can also be considered an implementation of sh (see below). | |
Because sh is a specification, not an implementation, /bin/sh is a symlink (or a hard link) to an actual implementation on most POSIX systems. | |
What is bash | |
bash started as an sh-compatible implementation (although it predates the POSIX standard by a few years), but as time passed it has acquired many extensions. Many of these extensions may change the behavior of valid POSIX shell scripts, so by itself bash is not a valid POSIX shell. Rather, it is a dialect of the POSIX shell language. | |
bash supports a --posix switch, which makes it more POSIX-compliant. It also tries to mimic POSIX if invoked as sh. | |
sh = bash? | |
For a long time, /bin/sh used to point to /bin/bash on most GNU/Linux systems. As a result, it had almost become safe to ignore the difference between the two. But that started to change recently. | |
Some popular examples of systems where /bin/sh does not point to /bin/bash (and on some of which /bin/bash may not even exist) are: | |
Modern Debian and Ubuntu systems, which symlink sh to dash by default; | |
Busybox, which is usually run during the Linux system boot time as part of initramfs. It uses the ash shell implementation. | |
BSDs, and in general any non-Linux systems. OpenBSD uses pdksh, a descendant of the Korn shell. FreeBSD's sh is a descendant of the original UNIX Bourne shell. Solaris has its own sh which for a long time was not POSIX-compliant; a free implementation is available from the Heirloom project. | |
https://jvns.ca/blog/2017/03/26/bash-quirks/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment