当前位置 博文首页 > csh,tcsh,bash,sh等shell的区别

    csh,tcsh,bash,sh等shell的区别

    作者:admin 时间:2021-02-15 12:36

    出自bash的faq,仔细看看。顺便翻译学习一下。

    复制代码 代码如下:

    Section C: Differences from other Unix shells
    C:跟其他UNIX shells脚本的区别
    C1) How does bash differ from sh, the Bourne shell?
    C1) bash和 sh、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.
    这时一个不全面的bash和SVR4.2 shell特性区别的列表,bash手册解释的更详细
    Things bash has that sh does not:
    bash特有的功能:
            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
             time保留字测试管道或内建命令耗时情况
            the `function' reserved word
            the `select' compound command and reserved word
            select复合命令和保留字
            arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
            算术命令:for ((expr1 ; expr2; expr3 )); do list; done
            new $'...' and $"..." quoting
            新的引用方法$'...'  $"..."
            the $(...) form of command substitution
            $(...) 命令替代用法
            the $(<filename) form of command substitution, equivalent to
                    $(cat filename)
            $(<filename)形式的命令的替换,相当于$(cat filename)
            the ${#param} parameter value length operator
            ${#param} 测试参数param的值的长度
            the ${!param} indirect parameter expansion operator
            ${!param} 间接参数扩展操作
            the ${!param*} prefix expansion operator
            ${!param*} 前缀扩展操作
            the ${param:offset[]} parameter substring operator
           ${param:ffset[]}参数通过偏移量截取子串操作
            the ${param/pat[/string]} parameter pattern substitution operator
            ${param/pat[/string]} 参数模式替换的操作
            expansions to perform substring removal (${p%[%]w}, ${p#[#]w})
             扩展子串删除命令:(${p%[%]w}, ${p#[#]w})
            expansion of positional parameters beyond $9 with ${num}
            扩展了为止参数超过9的限制
            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-
             重定向规则: <>, &>, >|, <<<, [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 `.'
            bash返回内建命令 将退出一个.文件源
            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 -m/-p/-u,
                      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 reads这样写交互脚本,环境变量非交互的。
            bash restricted shell mode is more extensive
            bash更广泛的受限模式
            bash allows functions and variables with the same name
            允许函数名变量名一样
            brace expansion
            括号扩展
            tilde expansion
            ~波浪号扩展
            arithmetic expansion with $((...)) and `let' builtin
            算术扩展:$((...)) 和let命令
            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
             上边一堆新的bash内建命令。
            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
            POSIX.2风格的通配符类、等价类、通配符号
            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
            debugger support, including `caller' builtin and new variables
            调试支持,包括caller内建命令和新变量
            RETURN trap

     
    Things sh has that bash does not:
    下边是sh有但是bash木有的
            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

    下边都和上边比较雷同了。。。大致浏览吧。
    C2) How does bash differ from the Korn shell, version ksh88?

    Things bash has or uses that ksh88 does not:
            long invocation options
            [-+]O invocation option
            -l invocation option
            `!' reserved word
            arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
            arithmetic in largest machine-supported size (intmax_t)
            posix mode and posix conformance
            command hashing
            tilde expansion for assignment statements that look like $PATH
            process substitution with named pipes if /dev/fd is not available
            the ${!param} indirect parameter expansion operator
            the ${!param*} prefix expansion operator
            the ${param:offset[]} parameter substring operator
            the ${param/pat[/string]} parameter pattern substitution operator
            variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, SHLVL,
                       TIMEFORMAT, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE,
                       HISTFILESIZE, HISTIGNORE, HISTCONTROL, PROMPT_COMMAND,
                       IGNOREEOF, FIGNORE, INPUTRC, HOSTFILE, DIRSTACK,
                       PIPESTATUS, HOSTNAME, OPTERR, SHELLOPTS, GLOBIGNORE,
                       GROUPS, FUNCNAME, histchars, auto_resume
            prompt expansion with backslash escapes and command substitution
            redirection: &> (stdout and stderr), <<<, [n]<&word-, [n]>&word-
            more extensive and extensible editing and programmable completion
            builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable,
                      exec -l/-c/-a, fc -s, export -n/-f/-p, hash, help, history,
                      jobs -x/-r/-s, kill -s/-n/-l, local, logout, popd, pushd,
                      read -e/-p/-a/-t/-n/-d/-s, readonly -a/-n/-f/-p,
                      set -o braceexpand/-o histexpand/-o interactive-comments/
                      -o notify/-o physical/-o posix/-o hashall/-o onecmd/
                      -h/-B/-C/-b/-H/-P, set +o, suspend, trap -l, type,
                      typeset -a/-F/-p, ulimit -u, umask -S, alias -p, shopt,
                      disown, printf, complete, compgen
            `!' csh-style history expansion
            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
            `**' arithmetic operator to do exponentiation
            redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr
            arrays of unlimited size
            TMOUT is default timeout for `read' and `select'
            debugger support, including the `caller' builtin
            RETURN trap
            Timestamps in history entries
            {x..y} brace expansion

    Things ksh88 has or uses that bash does not:
            tracked aliases (alias -t)
            variables: ERRNO, FPATH, EDITOR, VISUAL
            co-processes (|&, >&p, <&p)
            weirdly-scoped functions
            typeset +f to list all function names without definitions
            text of command history kept in a file, not memory
            builtins: alias -x, cd old new, newgrp, print,
                      read -p/-s/var?prompt, set -A/-o gmacs/
                      -o bgnice/-o markdirs/-o trackall/-o viraw/-s,
                      typeset -H/-L/-R/-Z/-A/-ft/-fu/-fx/-l/-u/-t, whence
            using environment to pass attributes of exported variables
            arithmetic evaluation done on arguments to some builtins
            reads .profile from $PWD when invoked as login shell

    Implementation differences:
            ksh runs last command of a pipeline in parent shell context
            bash has brace expansion by default (ksh88 compile-time option)
            bash has fixed startup file for all interactive shells; ksh reads $ENV
            bash has exported functions
            bash command search finds functions before builtins
            bash waits for all commands in pipeline to exit before returning status
            emacs-mode editing has some slightly different key bindings

     
    C3) Which new features in ksh-93 are not in bash, and which are?

    New things in ksh-93 not in bash-3.0:
            associative arrays
            floating point arithmetic and variables
            math library functions
            ${!name[sub]} name of subscript for associative array
            `.' is allowed in variable names to create a hierarchical namespace
            more extensive compound assignment syntax
            discipline functions
            `sleep' and `getconf' builtins (bash has loadable versions)
            typeset -n and `nameref' variables
            KEYBD trap
            variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, .sh.version,
                       .sh.name, .sh.subscript, .sh.value, .sh.match, HISTEDIT
            backreferences in pattern matching (\N)
            `&' operator in pattern lists for matching
            print -f (bash uses printf)
            `fc' has been renamed to `hist'
            `.' can execute shell functions
            exit statuses between 0 and 255
            `+=' variable assignment operator
            FPATH and PATH mixing
            getopts -a
            -I invocation option
            printf %H, %P, %T, %Z modifiers, output base for %d
            lexical scoping for local variables in `ksh' functions
            no scoping for local variables in `POSIX' functions

    New things in ksh-93 present in bash-3.0:
            [n]<&word- and [n]>&word- redirections (combination dup and close)
            for (( expr1; expr2; expr3 )) ; do list; done - arithmetic for command
            ?:, ++, --, `expr1 , expr2' arithmetic operators
            expansions: ${!param}, ${param:offset[]}, ${param/pat[/str]},
                        ${!param*}
            compound array assignment
            the `!' reserved word
            loadable builtins -- but ksh uses `builtin' while bash uses `enable'
            `command', `builtin', `disown' builtins
            new $'...' and $"..." quoting
            FIGNORE (but bash uses GLOBIGNORE), HISTCMD
            set -o notify/-C
            changes to kill builtin
            read -A (bash uses read -a)
            read -t/-d
            trap -p
            exec -c/-a
            `.' restores the positional parameters when it completes
            POSIX.2 `test'
            umask -S
            unalias -a
            command and arithmetic substitution performed on PS1, PS4, and ENV
            command name completion
            ENV processed only for interactive shells
            set -o pipefail

    js
    下一篇:没有了