シェルプログラムを書くとき、私たちはしばしば/bin/sh
and を使います/bin/bash
。通常はを使用しますがbash
、それらの違いはわかりません。
主な違いは何だbash
とはsh
?
bash
andでプログラミングする場合、何に注意する必要がありsh
ますか?
シェルプログラムを書くとき、私たちはしばしば/bin/sh
and を使います/bin/bash
。通常はを使用しますがbash
、それらの違いはわかりません。
主な違いは何だbash
とはsh
?
bash
andでプログラミングする場合、何に注意する必要がありsh
ますか?
回答:
sh
(またはシェルコマンド言語)は、POSIX標準によって記述されたプログラミング言語です。それは多くの実装を持っています(ksh88
、dash
、...)。bash
の実装と見なすこともできますsh
(以下を参照)。
sh
は仕様ではなく実装なので/bin/sh
、ほとんどのPOSIXシステムでの実際の実装へのシンボリックリンク(またはハードリンク)です。
bash
はsh
互換性のある実装として開始されました(ただし、POSIX標準より数年前にリリースされました)が、時間が経つにつれて多くの拡張機能を獲得しました。これらの拡張機能の多くは、有効なPOSIXシェルスクリプトの動作を変更する可能性があるため、それ自体bash
は有効なPOSIXシェルではありません。むしろ、それはPOSIXシェル言語の方言です。
bash
--posix
スイッチをサポートしているため、スイッチはPOSIXに準拠しています。として呼び出されsh
た場合も、POSIXを模倣しようとします。
長い間、ほとんどのGNU / Linuxシステムで/bin/sh
使用されてい/bin/bash
ました。その結果、両者の違いを無視することがほぼ安全になった。しかし、それは最近変化し始めました。
を/bin/sh
指さない/bin/bash
(そしてその中には/bin/bash
存在しない場合もある)システムのいくつかの一般的な例は次のとおりです。
sh
する最新のDebianおよびUbuntuシステムdash
。initramfs
。ash
シェル実装を使用しています。pdksh
、Kornシェルの子孫であるを使用します。FreeBSD sh
は、オリジナルのUNIX Bourneシェルの子孫です。Solarisには独自の機能がsh
あり、長い間POSIXに準拠していませんでした。無料の実装は家宝プロジェクトから入手できます。どのよう/bin/sh
にしてシステム上のポイントを見つけることができますか?
複雑なのは/bin/sh
、シンボリックリンクまたはハードリンクである可能性があることです。シンボリックリンクの場合、それを解決するポータブルな方法は次のとおりです。
% file -h /bin/sh
/bin/sh: symbolic link to bash
ハードリンクの場合は、
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
実際、-L
フラグはシンボリックリンクとハードリンクの両方をカバーしますが、この方法の欠点は、移植性がないことです。POSIX は find
この-samefile
オプションをサポートする必要はありませんが、GNU findとFreeBSD findはどちらもサポートしています。
最終的に、スクリプトの最初の行として«shebang»行を記述して、どちらを使用するかを決めるのはあなた次第です。
例えば
#!/bin/sh
を使用しますsh
(そして、何がポイントされていても)、
#!/bin/bash
使用/bin/bash
可能な場合に使用します(使用できない場合はエラーメッセージで失敗します)。もちろん、別の実装を指定することもできます。
#!/bin/dash
私自身のスクリプトでsh
は、次の理由で私が好みます。
bash
、持っている必要がありますsh
bash
同様に使用する利点があります。その機能により、プログラミングがより便利になり、他の最新のプログラミング言語でのプログラミングに似ています。これらには、スコープ付きローカル変数や配列などが含まれます。プレーンsh
は非常にミニマルなプログラミング言語です。
bash
構文エラーの場合に表示方法を使用してスクリプトを実行すると、より有用なエラーメッセージが表示されます。bashを使用すると、時間を節約できます。
%
コマンドラインの最初の意味は何ですか?
$
代わりに%
、または#
ルートシェルに使用します。
$
と#
...
sh
にbash(これもボーンシェルの略)のかなり前に存在していた。しかし、それは非常に原始的であり、ESC
キャラクターのような最終イベントには応答しませんでした。その後ksh
(bashの前にも)登場し、bashはより良いシェルのアイデアを愛していたがkshを嫌っていた人々によって始められました。:-)
sh
:http
bash
: //man.cx/sh:http : //man.cx/bash
TL; DR:より洗練された構文とより多くの機能を備えbash
たのスーパーセットですsh
。最新のプラットフォームではユビキタスなので、ほとんどすべてのケースでbashシバンラインを使用しても安全です。
注意:一部の環境でsh
は 、ですbash
。確認してくださいsh --version
。
この質問は、を使用しようsh
として、と同じように動作しないことに驚いた人のために、正規の質問として頻繁に推薦されていbash
ます。ここでは、よくある誤解と落とし穴の簡単な概要を示します。
まず、何を期待するかを理解する必要があります。
sh scriptname
、またはでそれを実行scriptname
し、持っている#!/bin/sh
中でシェバング行には、POSIXの期待すべきsh
行動を。bash scriptname
、またはでそれを実行scriptname
して持っている#!/bin/bash
シェバング行に(または同等のローカル)、あなたはbashの振る舞いを期待するべきです。一般的には、適切なシバンを用意し、スクリプト名(相対パスまたは完全パスを使用)だけを入力してスクリプトを実行することをお勧めします。正しいシバンに加えて、スクリプトファイルには実行権限(chmod a+x scriptname
)が必要です。
では、実際にはどう違うのですか?
Bashリファレンスマニュアルには、違いを列挙しようとするセクションがありますが、いくつかの一般的な混乱の原因は次のとおりです。
[[
は利用できませんsh
([
これはより不格好で限定されているもののみです)。sh
配列はありません。local
、source
、function
、shopt
、let
、declare
、およびselect
には移植できませんsh
。(いくつかのsh
実装は、例えばをサポートしlocal
ます。)for((i=0;i<=3;i++))
ループ、+=
インクリメントの割り当てなど、多くのCスタイルの構文拡張機能があります。この$'string\nwith\tC\aescapes'
機能は、暫定的にPOSIXで受け入れられています(つまり、現在Bashで機能しsh
ますが、現在のバージョンにのみ準拠しているシステムではまだサポートされません。POSIX仕様であり、しばらくの間はないでしょう)。<<<'here strings'
。*.{png,jpg}
かつ{0..12}
ブレース展開。~
$HOME
Bashでのみ参照されます(より一般的~username
にはのホームディレクトリusername
)。/bin/sh
実装にはない場合があります。<(cmd)
およびでプロセスを置き換え>(cmd)
ます。&|
for 2>&1 |
や&>
for などのCshスタイルの便利なリダイレクトエイリアスがあります。> ... 2>&1
<>
リダイレクトを伴うコプロセスをサポートしています。${substring:1:2}
、${variable/pattern/replacement}
等、大文字と小文字の変換を、$[expression]
構文がありますが、POSIX算術$((expression))
構文に置き換える必要があります。(ただし、一部のレガシーPOSIXより前のsh
実装ではサポートされていない場合があります。)$RANDOM
、$SECONDS
、$PIPESTATUS[@]
および$FUNCNAME
Bashの拡張です。export variable=value
やなどの構文の違い[ "x" == "y" ]
は移植可能ではありません(export variable
変数の割り当てとは別にする必要があり、移植可能な文字列比較で[ ... ]
は単一の等号を使用します)。これは要約されたリストであることに注意してください。完全なスクープについてはリファレンスマニュアルを、多くの適切な回避策についてはhttp://mywiki.wooledge.org/Bashismを参照してください。および/または多くのBashのみの機能を警告するhttp://shellcheck.net/を試してください。
一般的なエラーは、#!/bin/bash
シバン行があることですが、それでもsh scriptname
実際にスクリプトを実行するために使用しています。これは基本的にすべてのBashのみの機能を無効にするため、たとえば配列を使用しようとすると構文エラーが発生します。(シバン行は構文的にはコメントなので、このシナリオでは単に無視されます。)
残念ながら、Bashはとして呼び出されたときにこれらの構成体を使用しようとしたときに警告しませんsh
。また、すべての Bashのみの機能が完全に無効になるわけではないためsh
、スクリプトをash
/ dash
/ POSIX sh
またはHeirloomなどのバリアントに適切に移植できるかどうかを確認するのに適した方法ではないため、Bashを起動して実行します。sh
export variable=value
POSIXによって義務付けられています:pubs.opengroup.org/onlinepubs/009695399/utilities/export.html。おそらくそれはいくつかの古代の殻では利用できませんが、バシズムではありません。
シェル機能
次の表は、シェルを1つ選ぶよりも多くの機能を示しています。これは明確なリストを意図したものではなく、すべての可能なシェルのすべての可能な機能が含まれているわけではありません。機能は、オペレーティングシステムに付属するバージョンの場合、または標準のディストリビューションから直接コンパイルされた形で利用できる場合にのみ、シェルにあると見なされます。特に、以下で指定されているCシェルはSUNOS 4. *で使用可能なものです。かなりの数のベンダーが、代わりにtcshまたは独自の拡張Cシェルを出荷しています(彼らが常にtcshを出荷していることを明確にしているわけではありません)。
コード:
sh csh ksh bash tcsh zsh rc es
Job control N Y Y Y Y Y N N
Aliases N Y Y Y Y Y N N
Shell functions Y(1) N Y Y N Y Y Y
"Sensible" Input/Output redirection Y N Y Y N Y Y Y
Directory stack N Y Y Y Y Y F F
Command history N Y Y Y Y Y L L
Command line editing N N Y Y Y Y L L
Vi Command line editing N N Y Y Y(3) Y L L
Emacs Command line editing N N Y Y Y Y L L
Rebindable Command line editing N N N Y Y Y L L
User name look up N Y Y Y Y Y L L
Login/Logout watching N N N N Y Y F F
Filename completion N Y(1) Y Y Y Y L L
Username completion N Y(2) Y Y Y Y L L
Hostname completion N Y(2) Y Y Y Y L L
History completion N N N Y Y Y L L
Fully programmable Completion N N N N Y Y N N
Mh Mailbox completion N N N N(4) N(6) N(6) N N
Co Processes N N Y N N Y N N
Builtin artithmetic evaluation N Y Y Y Y Y N N
Can follow symbolic links invisibly N N Y Y Y Y N N
Periodic command execution N N N N Y Y N N
Custom Prompt (easily) N N Y Y Y Y Y Y
Sun Keyboard Hack N N N N N Y N N
Spelling Correction N N N N Y Y N N
Process Substitution N N N Y(2) N Y Y Y
Underlying Syntax sh csh sh sh csh sh rc rc
Freely Available N N N(5) Y Y Y Y Y
Checks Mailbox N Y Y Y Y Y F F
Tty Sanity Checking N N N N Y Y N N
Can cope with large argument lists Y N Y Y Y Y Y Y
Has non-interactive startup file N Y Y(7) Y(7) Y Y N N
Has non-login startup file N Y Y(7) Y Y Y N N
Can avoid user startup files N Y N Y N Y Y Y
Can specify startup file N N Y Y N N N N
Low level command redefinition N N N N N N N Y
Has anonymous functions N N N N N N Y Y
List Variables N Y Y N Y Y Y Y
Full signal trap handling Y N Y Y N Y Y Y
File no clobber ability N Y Y Y Y Y N F
Local variables N N Y Y N Y Y Y
Lexically scoped variables N N N N N N N Y
Exceptions N N N N N N N Y
上記の表のキー。
Yこのシェルを使用して機能を実行できます。
N機能がシェルに存在しません。
F機能は、shells関数メカニズムを使用することによってのみ実行できます。
Lこの機能を有効にするには、readlineライブラリをシェルにリンクする必要があります。
上記の表の注記
1. This feature was not in the original version, but has since become
almost standard.
2. This feature is fairly new and so is often not found on many
versions of the shell, it is gradually making its way into
standard distribution.
3. The Vi emulation of this shell is thought by many to be
incomplete.
4. This feature is not standard but unofficial patches exist to
perform this.
5. A version called 'pdksh' is freely available, but does not have
the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
シェルは、オペレーティングシステムのサービスにアクセスするためのユーザーとOS間のインターフェースです。GUIまたはCLI(コマンドラインインターフェイス)のいずれかです。
sh(Bourne sh ell)は、Unix / Unixのようなオペレーティングシステム用のシェルコマンドラインインタープリターです。それはいくつかの組み込みコマンドを提供します。スクリプト言語では、インタープリターをと表し#!/bin/sh
ます。これは、bash(無料/オープン)、kash(無料ではない)などの他のシェルで最も広くサポートされているものの1つでした。
Bash(B ourne a gain s hell)は、Bourneシェルのシェルの代替品です。Bashはshのスーパーセットです。Bashはshをサポートします。POSIXは、POSIX準拠システムの動作方法を定義する一連の標準です。Bashは実際にはPOSIX準拠のシェルではありません。スクリプト言語では、インタープリターをと表し#!/bin/bash
ます。
類推:
sh
(したがって、OOPの意味での「サブクラス」)を継承し、それを拡張する(つまり、機能のスーパーセットを持っている)と言っていると思います。
ターミナル
シェル
SH対 バッシュ
SH
バッシュ
参考資料:
シェル gnu.org:
基本的に、シェルは単にコマンドを実行するマクロプロセッサです。マクロプロセッサという用語は、テキストとシンボルを拡張してより大きな式を作成する機能を意味します。
Unix シェルは、コマンドインタープリタであり、プログラミング言語でもあります。 シェルはコマンドインタープリターとして、豊富なGNUユーティリティセットへのユーザーインターフェイスを提供します。プログラミング言語機能により、これらのユーティリティを組み合わせることができます。コマンドを含むファイルを作成して、それ自体をコマンドにすることができます。これらの新しいコマンドは、/ binなどのディレクトリにあるシステムコマンドと同じステータスを持ち、ユーザーまたはグループがカスタム環境を確立して、共通のタスクを自動化できるようにします。
シェルは、インタラクティブまたは非インタラクティブで使用できます。インタラクティブモードでは、キーボードから入力された入力を受け入れます。非対話的に実行する場合、シェルはファイルから読み取ったコマンドを実行します。
シェルを使用すると、同期および非同期の両方でGNUコマンドを実行できます。シェルは、同期コマンドが完了するのを待ってから、さらに入力を受け入れます。非同期コマンドは、追加のコマンドを読み取って実行する間、シェルと並行して実行を続けます。リダイレクションコンストラクトを使用すると、これらのコマンドの入力と出力をきめ細かく制御できます。さらに、シェルを使用すると、コマンドの環境の内容を制御できます。
シェルはまた、別個のユーティリティを介して取得することが不可能または不便な機能を実装する組み込みコマンド(ビルトイン)の小さなセットを提供します。たとえば、cd、break、continue、execはシェル自体を直接操作するため、シェルの外部に実装することはできません。特に、history、getopts、kill、またはpwdビルトインは、個別のユーティリティで実装できますが、組み込みコマンドとして使用する方が便利です。すべてのシェルビルトインについては、後続のセクションで説明します。
コマンドの実行は不可欠ですが、シェルの能力(および複雑さ)のほとんどは、組み込みプログラミング言語によるものです。 他の高水準言語と同様に、シェルは変数、フロー制御構成、引用、関数を提供します。
シェルは、プログラミング言語を強化するためではなく、インタラクティブな使用のために特別に調整された機能を提供します。これらのインタラクティブな機能には、ジョブ制御、コマンドライン編集、コマンド履歴、エイリアスが含まれます。これらの各機能については、このマニュアルで説明しています。
BASH gnu.org:
Bashは、GNUオペレーティングシステムのシェルまたはコマンド言語インタープリターです。この名前は、「ボーンアゲインシェル」の頭字語であり、現在のUnixシェルshの直接の祖先の作者であるスティーブンボーンにちなんで、第7版のベル研究所のバージョンのUnixに登場しました。
Bashはshとほぼ互換性があり、KornシェルkshおよびCシェルcshの便利な機能が組み込まれています。これは、IEEE POSIX仕様(IEEE標準1003.1)のIEEE POSIXシェルおよびツール部分の準拠実装になることを目的としています。インタラクティブおよびプログラミングの両方で使用できるように、shよりも機能が向上しています。
GNUオペレーティングシステムは、cshのバージョンを含む他のシェルを提供しますが、Bashがデフォルトのシェルです。他のGNUソフトウェアと同様に、Bashは非常に移植性があります。現在、Unixのほぼすべてのバージョンと他のいくつかのオペレーティングシステムで実行されています-MS-DOS、OS / 2、およびWindowsプラットフォーム用に独立してサポートされているポートが存在します。
その他の回答では、一般にBashとPOSIXシェル標準の違いが指摘されています。ただし、移植可能なシェルスクリプトを記述してBash構文に慣れている場合は、典型的なバシズムと対応する純粋なPOSIXソリューションのリストが非常に便利です。このようなリストは、UbuntuがデフォルトのシステムシェルとしてBashからDashに切り替えたときにコンパイルされたもので、https: //wiki.ubuntu.com/DashAsBinShにあります。
さらに、スクリプトのbashismをチェックするcheckbashisms と呼ばれる優れたツールがあり、スクリプトが移植可能であることを確認したい場合に便利です。
それらはほとんど同一ですが、bash
より多くの機能を備えています – sh
(多かれ少なかれ)の古いサブセットですbash
。
sh
()Bourne shell
より前の1977年に作成されたオリジナルのを意味することがよくあります。しかし、実際には、1992年のPOSIX標準に準拠した相互互換性の高いシェルと考えるのがよいでしょう。bash
Bourne *again* shell
シェルで始まる、#!/bin/sh
またはsh
シェルを使用するスクリプトは、通常、下位互換性のためにそうします。UNIX / Linux OSにはsh
シェルがあります。Ubuntuではsh
頻繁に起動dash
し、MacOSではの特別なPOSIXバージョンですbash
。これらのシェルは、標準に準拠した動作、速度、または下位互換性のために推奨される場合があります。
bash
はオリジナルよりも新しく、よりsh
多くの機能を追加し、との下位互換性を追求していますsh
。理論的には、sh
プログラムはで実行する必要がありbash
ます。 bash
ほぼすべてのlinux / unixマシンで使用でき、通常デフォルトで使用されます。ただし、MacOSのデフォルトzsh
はCatalina(10.15)以降です。FreeBSDは、デフォルトではbash
インストールされていません。
sh
POSIXよりもはるかに古い。最近、あなたはsh
あなたが見つけたものが少なくともPOSIX互換であることを望みます。しかし、レガシーシステムでは、これは決して当然のことではありません。POSIXはシェルよりもはるかに安定しています。実際、オペレーティングシステムコールとライブラリ関数の標準化がより重要であると主張することもできます。
/bin/sh
と同じプログラムを呼び出す場合と呼び出さない場合があり/bin/bash
ます。
sh
少なくともPOSIXに必要な機能をサポートしています(正しい実装を前提としています)。拡張機能もサポートする場合があります。
bash
「Bourne Again Shell」は、shとbash固有の拡張に必要な機能を実装しています。拡張機能の完全なセットはここで説明するには長すぎるため、新しいリリースによって異なります。違いはbashマニュアルに記載されています。入力info bash
し、「バッシュが機能」(現在のバージョンではセクション6)を読み取るか、読んでオンライン現在のドキュメントを。
sh
PATH
現在のシェルで適切に設定されている場合にのみ、POSIXシェルが提供されます。POSIXシェルを提供する定義済みのPATH名はありません。
sh
必ずしも提供していませんでした。
bashとshは2つの異なるシェルです。基本的にbashはshであり、より多くの機能とより良い構文を備えています。ほとんどのコマンドは同じように機能しますが、それらは異なります。Bash(bash)は、多くの利用可能な(まだ最も一般的に使用されている)Unixシェルの1つです。Bashは「Bourne Again SHell」の略で、オリジナルのBourneシェル(sh)の代替/改良版です。
シェルスクリプトは任意のシェルでのスクリプトですが、BashスクリプトはBash専用のスクリプトです。ただし、実際には、問題のシェルがBashでない限り、「シェルスクリプト」と「bashスクリプト」は同じ意味で使用されることがよくあります。
そうは言っても、ほとんどのシステムの/ bin / shはシンボリックリンクであり、shを呼び出さないことを理解する必要があります。Ubuntuでは、/ bin / shはLinuxディストリビューションでの典型的な動作であるbashへのリンクに使用されていましたが、ダッシュと呼ばれる別のシェルへのリンクに変更されました。私がbashを使用するのは、それがかなり標準的な(または私の経験からは少なくとも最も一般的な)ためです。実際、bashスクリプトが#!/ bin / shを使用すると問題が発生します。これは、スクリプトメーカーがリンクをbashにする必要がない場合に、リンクがbashであると想定するためです。
可能な限り簡単な違い: 基本的な理解があれば、上に投稿された他のコメントを見つけやすくなります。
シェル -「シェル」は、ユーザーとオペレーティングシステム(カーネル)間の対話を容易にするプログラムです。sh、bash、csh、zshなど、多くのシェル実装が利用可能です。
任意のシェルプログラムを使用して、そのシェルプログラムでサポートされているコマンドを実行できます。
バッシュは -それが由来B ourne- ゲインShは ELL。このプログラムを使用して、シェルで指定されたすべてのコマンドを実行できます。また、このプログラムに追加されたいくつかのコマンドを実行できます。Bashにはshとの下位互換性があります。
Sh-ボーンシェルから派生。「sh」は、シェルで指定されたすべてのコマンドをサポートします。つまり、このプログラムを使用すると、Shellで指定されたすべてのコマンドを実行できます。
詳細については、実行します - https://man.cx/sh - https://man.cx/bash
Linuxオペレーティングシステムは、さまざまなタイプのシェルを提供します。シェルには多くの共通のコマンドがありますが、各タイプには固有の機能があります。主に使用されているさまざまな種類のシェルを調べてみましょう。
Shシェル:
Shシェルはボーンシェルとも呼ばれます。Shシェルは、1977年にAT&TのBell LabsでStephen BourneによってUnixコンピュータ用に開発された最初のシェルです。多くのスクリプトツールが含まれています。
バッシュシェル:
BashシェルはBourne Again Shellの略です。Bashシェルは、ほとんどのLinuxディストリビューションのデフォルトシェルであり、Shシェルの代わりになります(ShシェルはBashシェルでも実行されます)。Bash Shellは、Shシェルスクリプトの大部分を変更せずに実行でき、コマンドライン編集機能も提供します。