Created
October 30, 2012 11:33
-
-
Save carno/3979724 to your computer and use it in GitHub Desktop.
How does bash differ from sh, the Bourne shell?
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
| # http://www.unixguide.net/unix/bash/C1.shtml | |
| How does bash differ from sh, the Bourne shell? | |
| This is a non-comprehensive list of features that differentiate bash | |
| from the SVR4.2 shell. The bash manual page explains these more | |
| completely. | |
| Things bash has that sh does not: | |
| long invocation options | |
| [+-]O invocation option | |
| `!' reserved word to invert pipeline return value | |
| `time' reserved word to time pipelines and shell builtins | |
| the `function' reserved word | |
| the `select' compound command and reserved word | |
| arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done | |
| new $'...' and $"..." quoting | |
| the $(...) form of command substitution | |
| the $( $(cat filename) | |
| the ${#param} parameter value length operator | |
| the ${!param} indirect parameter expansion operator | |
| the ${!param*} prefix expansion operator | |
| the ${param:offset[:length]} parameter substring operator | |
| the ${param/pat[/string]} parameter pattern substitution operator | |
| expansions to perform substring removal (${p%[%]w}, ${p#[#]w}) | |
| expansion of positional parameters beyond $9 with ${num} | |
| variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, REPLY, | |
| TIMEFORMAT, PPID, PWD, OLDPWD, SHLVL, RANDOM, SECONDS, | |
| LINENO, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE, HOSTNAME, | |
| ENV, PS3, PS4, DIRSTACK, PIPESTATUS, HISTSIZE, HISTFILE, | |
| HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, GROUPS, | |
| PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC, | |
| SHELLOPTS, OPTERR, HOSTFILE, TMOUT, FUNCNAME, histchars, | |
| auto_resume | |
| DEBUG trap | |
| ERR trap | |
| variable arrays with new compound assignment syntax | |
| redirections: <>, &>, >| | |
| prompt string special char translation and variable expansion | |
| auto-export of variables in initial environment | |
| command search finds functions before builtins | |
| bash return builtin will exit a file sourced with `.' | |
| builtins: cd -/-L/-P, exec -l/-c/-a, echo -e/-E, hash -p/-t. | |
| export -n/-f/-p/name=value, pwd -L/-P, | |
| read -e/-p/-a/-t/-n/-d/-s, | |
| readonly -a/-f/name=value, trap -l, set +o, | |
| set -b/-m/-o option/-h/-p/-B/-C/-H/-P, | |
| unset -f/-v, ulimit -m/-p/-u, | |
| type -a/-p/-t, suspend -f, kill -n, | |
| test -o optname/s1 == s2/s1 < s2/s1 > s2/-nt/-ot/-ef/-O/-G/-S | |
| bash reads ~/.bashrc for interactive shells, $ENV for non-interactive | |
| bash restricted shell mode is more extensive | |
| bash allows functions and variables with the same name | |
| brace expansion | |
| tilde expansion | |
| arithmetic expansion with $((...)) and `let' builtin | |
| the `[[...]]' extended conditional command | |
| process substitution | |
| aliases and alias/unalias builtins | |
| local variables in functions and `local' builtin | |
| readline and command-line editing with programmable completion | |
| command history and history/fc builtins | |
| csh-like history expansion | |
| other new bash builtins: bind, command, compgen, complete, builtin, | |
| declare/typeset, dirs, enable, fc, help, | |
| history, logout, popd, pushd, disown, shopt, | |
| printf | |
| exported functions | |
| filename generation when using output redirection (command >a*) | |
| POSIX.2-style globbing character classes | |
| POSIX.2-style globbing equivalence classes | |
| POSIX.2-style globbing collating symbols | |
| egrep-like extended pattern matching operators | |
| case-insensitive pattern matching and globbing | |
| variable assignments preceding commands affect only that command, | |
| even for builtins and functions | |
| posix mode | |
| redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr, | |
| /dev/tcp/host/port, /dev/udp/host/port | |
| Things sh has that bash does not: | |
| uses variable SHACCT to do shell accounting | |
| includes `stop' builtin (bash can use alias stop='kill -s STOP') | |
| `newgrp' builtin | |
| turns on job control if called as `jsh' | |
| $TIMEOUT (like bash $TMOUT) | |
| `^' is a synonym for `|' | |
| new SVR4.2 sh builtins: mldmode, priv | |
| Implementation differences: | |
| redirection to/from compound commands causes sh to create a subshell | |
| bash does not allow unbalanced quotes; sh silently inserts them at EOF | |
| bash does not mess with signal 11 | |
| sh sets (euid, egid) to (uid, gid) if -p not supplied and uid < 100 | |
| bash splits only the results of expansions on IFS, using POSIX.2 | |
| field splitting rules; sh splits all words on IFS | |
| sh does not allow MAILCHECK to be unset (?) | |
| sh does not allow traps on SIGALRM or SIGCHLD | |
| bash allows multiple option arguments when invoked (e.g. -x -v); | |
| sh allows only a single option argument (`sh -x -v' attempts | |
| to open a file named `-v', and, on SunOS 4.1.4, dumps core. | |
| On Solaris 2.4 and earlier versions, sh goes into an infinite | |
| loop.) | |
| sh exits a script if any builtin fails; bash exits only if one of | |
| the POSIX.2 `special' builtins fails | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment