GNU/Linux 操作系统中的 /bin/sh 是 bash(Bourne-Again Shell)的符号链接,但鉴于 bash 过于复杂,有人把 ash 从 NetBSD 移植到 Linux 并更名为 dash(Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Ubuntu 号称自从他们在 6.10 版里这样做了以后,系统启动速度有了明显的提升。Debian 计划在下一个发行版(代号 lenny)中也将 dash 作为默认的 /bin/sh。
1、bash的POSIX标准
在一般的linux系统当中(如redhat),
使用sh调用执行脚本相当于打开了bash的POSIX标准模式
(等效于bash的 --posix 参数)
一般的,sh是bash的“子集”
(不是子集的部分,具体区别见下的“Things sh has that bash does not”)
例子:
[wwy@sf-watch test]$ cat t2.sh #!/bin/bash diff <(echo xxx) <(echo yyy) [wwy@sf-watch test]$ bash -x ./t2.sh # 使用bash 调用,不会出问题 + diff /dev/fd/63 /dev/fd/62 ++ echo xxx ++ echo yyy 1c1 < xxx --- > yyy [wwy@sf-watch test]$ sh ./t2.sh # 而用sh调用,报错如下 ./t2.sh: line 3: syntax error near unexpected token `(' ./t2.sh: line 3: `diff <(echo xxx) <(echo yyy)' [wwy@sf-watch test]$ echo $? 2 |
[wangweiyu@ComSeOp mon]$ which sh /bin/sh [wangweiyu@ComSeOp mon]$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 Mar 21 2007 /bin/sh -> bash |
Things bash has that sh does not: long invocation options [+-]O invocation option -l 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 $( the ${#param} parameter value length operator the ${!param} indirect parameter expansion operator the ${!param*} prefix expansion operator the ${param ![]() 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: <>, &>, >|, <<<, [n]<&word-, [n]>&word- 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 -d/-l/-p/-t. export -n/-f/-p/name=value, pwd -L/-P, read -e/-p/-a/-t/-n/-d/-s/-u, readonly -a/-f/name=value, trap -l, set +o, set -b/-m/-o option/-h/-p/-B/-C/-H/-P, unset -f/-v, ulimit -i/-m/-p/-q/-u/-x, type -a/-p/-t/-f/-P, 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 and strict posix conformance redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr, /dev/tcp/host/port, /dev/udp/host/port debugger support, including `caller' builtin and new variables RETURN trap the `+=' assignment operator 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 |
BASH: 1、交互式的登录shell (bash –il xxx.sh) 载入的信息: /etc/profile ~/.bash_profile( -> ~/.bashrc -> /etc/bashrc) ~/.bash_login ~/.profile 2、非交互式的登录shell (bash –l xxx.sh) 载入的信息: /etc/profile ~/.bash_profile ( -> ~/.bashrc -> /etc/bashrc) ~/.bash_login ~/.profile $BASH_ENV 3、交互式的非登录shell (bash –i xxx.sh) 载入的信息: ~/.bashrc ( -> /etc/bashrc) 4、非交互式的非登录shell (bash xxx.sh) 载入的信息: $BASH_ENV SH: 1、交互式的登录shell 载入的信息: /etc/profile ~/.profile 2、非交互式的登录shell 载入的信息: /etc/profile ~/.profile 3、交互式的非登录shell 载入的信息: $ENV 4、非交互式的非登录shell 载入的信息: nothing |
[wangweiyu@ComSeOp ~]$ grep ulimit /etc/profile ulimit -S -c unlimited > /dev/null 2>&1 |
[wangweiyu@ComSeOp ~]$ ssh [email protected] 'echo $-' [email protected]'s password: hBc [wangweiyu@ComSeOp ~]$ echo $- himBH [wangweiyu@ComSeOp ~]$ ssh [email protected] 'echo $0' [email protected]'s password: bash [wangweiyu@ComSeOp ~]$ echo $0 -bash |
[wangweiyu@ComSeOp ~]$ cat .bashrc # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi echo 'xxx' # 随便输出一些字符 [wangweiyu@ComSeOp ~]$ ssh [email protected] 'echo $-' [email protected]'s password: xxx # .bashrc 被执行 hBc |
[wangweiyu@ComSeOp ~]$ cat .bashrc # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi echo 'xxx' # 随便输出一些字符 [wangweiyu@ComSeOp ~]$ scp file [email protected]:/tmp [email protected]'s password: xxx # 输出xxx,随后scp失败 [wangweiyu@ComSeOp ~]$ echo $? 1 [wangweiyu@ComSeOp ~]$ ls /tmp/ [wangweiyu@ComSeOp ~]$ |