1. 程式人生 > >【shell】bash與sh的區別

【shell】bash與sh的區別

在我們所使用的系統當中,使用sh呼叫執行指令碼,相當於打開了bash的POSIX標準模式 (等效於bash的 --posix 引數) 一般的,sh是bash的“子集” (不是子集的部分,具體區別見下的“Things sh has that bash does not”) 例子: [[email protected] test]$ cat t2.sh  #!/bin/bash diff <(echo xxx) <(echo yyy) # 此語法包含bash的特性,不屬於sh的POSIX標準     [[email protected] test]$ bash -x ./t2.sh # 使用bash 呼叫,不會出問題 + diff /dev/fd/63 /dev/fd/62 ++ echo xxx ++ echo yyy
1c1 < xxx --- >    yyy [[email protected] test]$ sh ./t2.sh    # 而用sh呼叫,報錯如下 ./t2.sh: line 3: syntax error near unexpected token `(' ./t2.sh: line 3: `diff <(echo xxx) <(echo yyy)' [[email protected] test]$ echo $?  2 但是,在我們的linux系統中,sh是bash的一個軟連結: [[email protected]
mon]$ which sh 
/bin/sh [[email protected] mon]$ ls -l /bin/sh  lrwxrwxrwx  1 root root 4 Mar 21  2007 /bin/sh -> bash 那為什麼上面的例子中還會出現問題呢?原因在於: bash程式執行,當“$0”是“sh”的時候, 則要求下面的程式碼遵循一定的規範,當不符合規範的語法存在時,則會報錯, 所以可以這樣理解, “sh”並不是一個程式,而是一種標準(POSIX), 這種標準,在一定程度上保證了指令碼的跨系統性(跨UNIX系統) 下面的內容詳細的說明了bash與sh在語法等方面的具體差異:
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 $(<filename) form of command substitution, equivalent to       $(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: <>, &>, >|, <<<, [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 呼叫相關: 在指令碼的呼叫方面(interactive、login相關),bash與sh也是存在差異 以下是詳細說明(假如被呼叫執行的指令碼名字叫xxx.sh) 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 由此可以看出,最主要的區別在於相關配置檔案的是否載入, 而這些配置的是否載入,也就導致了很多預設選項的差異 (具體請仔細檢視~/.bash_profile 等檔案) 如: [[email protected] ~]$ grep ulimit /etc/profile     ulimit -S -c unlimited > /dev/null 2>&1 即,如果/etc/profile沒有被載入,則不會產生core dump 值得一提的是,使用ssh遠端執行命令, 遠端sshd程序通過“bash –c”的方式來執行命令(即“非互動式的非登入shell”) 所以這一點,和登入之後再在本地執行執行命令,就存在了一定的差異 如: [[email protected] ~]$ ssh [email protected] 'echo $-' [email protected]'s password:  hBc [[email protected] ~]$ echo $- himBH [[email protected] ~]$ ssh [email protected] 'echo $0' [email protected]'s password:  bash [[email protected] ~]$ echo $0 -bash 注: “$-” 中含有“i”代表“互動式shell” “$0”的顯示結果為“-bash”,bash前面多個“-”,代表“登入shell” 沒有“i“和“-”的,是“非互動式的非登入shell” 另外還有一點,雖然ssh遠端執行的命令是“非互動式的非登入shell”,但在執行命令之前,ssh的那一次登入本身是“互動式的登入shell”,所以其會先讀一下“~/.bash_profile” 如: [[email protected] ~]$ cat .bashrc  # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then         . /etc/bashrc fi echo 'xxx' [[email protected] ~]$ ssh [email protected] 'echo $-' [email protected]'s password:  xxx hBc 這一點,衍生出一個關於scp的問題,scp在傳輸資料之前,會先進行一次ssh登入, 而當.bashrc檔案有輸出的時候,則會導致scp失敗!原因是解析返回的資料包出現混亂 如: [[email protected] ~]$ cat .bashrc  # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then         . /etc/bashrc fi echo 'xxx' [[email protected] ~]$ scp file [email protected]:/tmp [email protected]'s password:  xxx [[email protected] ~]$ echo $? 1 [[email protected] ~]$ ls /tmp/ [[email protected] ~]$

轉自:http://hi.baidu.com/aaronike/blog/item/0072533d1068a5e83c6d97ea.html 

相關推薦

shellbashsh區別

在我們所使用的系統當中,使用sh呼叫執行指令碼,相當於打開了bash的POSIX標準模式 (等效於bash的 --posix 引數) 一般的,sh是bash的“子集” (不是子集的部分,具體區別見下的“Things sh has that bash does not”

js ajax axios 區別 ajax axios區別

ajax 與 axios區別 Ajax: Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種建立互動式網頁應用的網頁開發技術。 Ajax = 非同步 JavaScript 和

GNSSRTKDGNSS區別

差分GPS定位原理 它使用一臺 GPS基準接收機(基準站)和一臺使用者接收機(移動站),利用實時或事後處理技術,就可以使使用者測量時消去公共的誤差源 —衛星軌道誤差、衛星鐘差、大氣延時、多路徑效應。特別提出的是,當GPS工作衛星升空時,美國政府實行了SA政策。使衛星的軌道

VectorArrayList區別

1. Vector & ArrayList 1)  Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),而ArrayList的方法不是,由於執行緒的同步必然要影響效能,因此,ArrayList的效能比Vector好

CC99C89區別以及轉換方法

DATE: 2018.11.14 1、 C99與C89區別: 可變長陣列   C99中,程式設計師宣告陣列時,陣列的維數可以由任一有效的整型表示式確定,包括只在執行時才能確定其值的表示式,這類陣列就叫做可變長陣列,但是隻有區域性陣列才可以是變長的. 可變長陣

shell反引號(`)$()的作用區別

linux下的反引號(`)和$()執行的是命令替換的功能。 1、將命令的執行結果賦給一個變數 反引號: DATE=`date` //變數=`命令` echo $DATE 執行結果為: [[email protected] Signal_shell]

shell常用的幾種shell直譯器:sh,bash,zsh,ash,csh

Date: 2018.9.6 1、參考: 2、常用shell Shell 既是一種指令碼程式語言,也是一個連線核心和使用者的軟體。 常見的 Shell 有 sh、bash、csh、tcsh、ash,zsh 等。 sh sh 的全稱是

轉載CreateThread_beginthreadex本質區別

wmi ted 函數返回值 rar turn 問題 初始化 控制 switch 轉載文章,原文地址:http://blog.csdn.net/morewindows/article/details/7421759 本文將帶領你與多線程作第一次親密接觸,並深入分析Cr

innerHTMLjQuery裏的html()區別介紹

word www. 函數 利用 table ber order light syntax http://www.jb51.net/article/31548.htm 1、 2、 innerHTML與jquery裏的html()區別介紹 轉載 2012-10-12 投

轉載DOMContentLoadedload的區別

頭部 布局 chrome 顯示 err event scrip rom 資源文件 (1)在chrome瀏覽器的開發過程中,我們會看到network面板中有這兩個數值,分別對應網 絡請求上的標誌線,這兩個時間數值分別代表什麽? (2)我們一再強調將css放在頭部,將

說說{}[]這兩個符號有什麼區別?

【轉】出自:  http://blog.51cto.com/lidao/1926390   1.題目 說說{}與[]這兩個符號有什麼區別? 2.參考答案 這兩個看似簡單的符號,其實內容還不少。我們一起來看看。 2.1 萬用字元中 萬用字元在linux中通常用來匹配/找檔名或目

@Resource@Autowired註解的區別

一、寫本博文的原因   年初剛加入到現在的專案時,在使用註解時我用的@Resource。後來,同事:你怎麼使用@Resource註解?我:使用它有錯嗎?同事:沒錯,但是現在都使用@Autowired。我:我研究一下。 在大學,學習J2EE實訓時一直使用的是@Resource註解

linux shell 指令碼1 ---- echo printf 用法

終端列印的常用命令有 echo 和 printf 兩種。 先說基本用法: echo: 1. echo Hello Word ! 命令列輸出:Hello Word ! 2. echo 'Hello Word !' 命令列輸出:Hello Word ! 3. echo

Shell別把&和nohup混為一談, 根本不是同一個東西好不好 ------ 聊聊./a.out & , nohut ./a.out , nohup ./a.out &的區別

在第一家公司工作的時候, 我認識了&,在第二家公司工作的時候, 我認識了nohup, 這就是淵源。 隨後, 我就一直糊塗用他們, 但並不懂這兩個東西。 網上很多地方是亂扯, 瞎複製, 為什麼不自己實踐一下呢? 看個小程式: int main () { in

Shelllinux bash Shell特殊變數:Shell $0, $#, $*, [email protected]<

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949

轉載RTL technology schematic的區別,包含概念例項

下面是xilinx官網上的問答貼: The difference between RTL and technology schematic Description After XST synthesis is completed, I am able t

NLP語義語用的區別

語義學研究句子的字面含義,語用學研究句子的言外之意。 舉個例子說,比如小紅和小明在一間屋子裡寫作業,這個時候小紅說:“啊呀我覺得好冷啊。” 那semantics研究的就是小紅說的那句話的意思為:小紅在那一天在那間屋子裡在那個時刻覺得很冷,不是有點冷(可能是會發抖的冷,這裡

HTTPHTTPHTTPS的區別

  超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊,HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此,HTTP協議不適合傳輸一些敏感資訊,比如:信用卡號、密

CMinGWMSVC編譯的區別

  本人使用的是QT5.6,當時我們選擇下載的是第一個VS2015版本,也就是通過MSVC方式編譯。 我們來對比一下這兩個編譯器的區別: MSVC是指微軟的VC編譯器 MinGW是指是Minimalist GNU on Windows的縮寫。它是一個可自由使用和

jQuerymouseovermouseenter的區別

                          mouseover與mouseenter的區別 請先看下面講解,文章最後有原始碼 頁面上有4個div,di