1. 程式人生 > 實用技巧 >/bin/sh、/bin/bash、/bin/dash、/bin/rbash的區別

/bin/sh、/bin/bash、/bin/dash、/bin/rbash的區別

/bin/sh、/bin/bash、/bin/dash、/bin/rbash的區別
bash
檢視系統可以使用的shell種類
檢視預設shell
sh
把sh改為指向bash(修改預設shell)
dash
把sh改為指dash(修改預設shell)TOC

/bin/sh、/bin/bash、/bin/dash、/bin/rbash的區別

參考:

bash

bash 是一個為GNU計劃編寫的Unix shell。它的名字是一系列縮寫:Bourne-Again SHell — 這是關於Bourne shell(sh)的一個雙關語(Bourne again / born again)。Bourne shell是一個早期的重要shell,由史蒂夫·伯恩在1978年前後編寫,並同Version 7 Unix一起釋出。bash則在1987年由布萊恩·福克斯創造。

bash (GNU Bourne-Again Shell) 是許多Linux發行版的預設Shell 。事實上,還有許多傳統UNIX上用的Shell,例如tcshcsh、ashbshksh等等,Shell Script大致都類同。
由於歷史原因,UNIX系統上有很多種Shell:

  • sh(C Shell):由Bill Joy開發,隨BSD UNIX釋出,它的流程控制語句很像C語言,支援很多Bourne Shell所不支援的功能:作業控制,命令歷史,命令列編輯。
  • ksh(Korn Shell):由David Korn開發,向後相容sh的功能,並且添加了csh引入的新功能,是目前很多UNIX系統標準配置的Shell,在這些系統上/bin/sh往往是指向/bin/ksh的符號連結。
  • tcsh(TENEX C Shell):是csh的增強版本,引入了命令補全等功能,在FreeBSD、Mac OS X等系統上替代了csh。
  • bash(Bourne Again Shell):由GNU開發的Shell,主要目標是與POSIX標準保持一致,同時兼顧對sh的相容,bash從csh和ksh借鑑了很多功能,是各種Linux發行版標準配置的Shell,在Linux系統上/bin/sh往往是指向/bin/bash的符號連結。

檢視系統可以使用的shell種類

可使用cat /etc/shells 指令檢視自己系統可以使用的shell種類:

root@ubuntu:/$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux
/usr/bin/screen

檢視預設shell

使用者的預設Shell設定在/etc/passwd檔案中,例如: vim /etc/passwd

root:x:0:0:root:/root:/bin/bash

sh

在shell指令碼的開頭往往有一句話來定義使用哪種sh直譯器來解釋指令碼。
目前常見的shell指令碼中主要有以下兩種方式:
(1) #!/bin/sh
(2)#!/bin/bash

注意:每個指令碼開頭都使用"#!",#!實際上是一個2位元組魔法數字,這是指定一個檔案型別的特殊標記,在這種情況下,指的就是一個可執行的指令碼。在#!之後,接一個路徑名,這個路徑名指定了一個解釋指令碼命令的程式,這個程式可以是shell,程式語言或者任意一個通用程式。
sh是bash的一種特殊的模式,也就是/bin/sh 相當於/bin/bash --posix。說白了sh就是開啟了POSIX標準的bash 。
在一般的linux系統當中(如redhat),使用sh呼叫執行指令碼相當於打開了bash的POSIX標準模式
sh一般設成bash的軟鏈:

ll -h /bin/sh
---------
lrwxrwxrwx 1 root root 4 Jul 26  2018 /bin/sh -> dash*

把sh改為指向bash(修改預設shell)

方法1:直接把/bin/sh的軟連結改到bash中,

ln -s /bin/bash /bin/sh

方法二:配置shell

sudo dpkg-reconfigure dash

dash

但鑑於 bash 過於複雜,有人把 bash 從 NetBSD 移植到 Linux 並更名為 dash(Debian Almquist Shell),並以獲得更快的指令碼執行速度。Debian Almquist shell,縮寫為dash,一種 Unix shell。它比 Bash 小,只需要較少的磁碟空間,但是它的對話性功能也較少。它由 NetBSD版本的Almquist shell (ash)發展而來,於1997年,由赫伯特·許(Herbert Xu)移植到Linux上,於2002年改名為 dash。

ll -h /bin/
------
-rwxr-xr-x  1 root root 1.1M Apr  5  2018 bash*
-rwxr-xr-x  1 root root 119K Jan 25  2018 dash*

可以看到,1.1M和119K的區別

把sh改為指dash(修改預設shell)

sudo dpkg-reconfigure dash

選擇yes使用dash作為預設的shell即可修改為dash。



來自為知筆記(Wiz)