shとbashの違い


1304

シェルプログラムを書くとき、私たちはしばしば/bin/shand を使います/bin/bash。通常はを使用しますがbash、それらの違いはわかりません。

主な違いは何だbashとはsh

bashandでプログラミングする場合、何に注意する必要がありshますか?


21
Bourneシェルで動作するバシズムと対応するコードの有用なリストについては、mywiki.wooledge.org / Bashism
StackExchange saddens dancek

1
あなたは見てみたいことがありPOSIXの SHとそのコマンド言語のための標準を:* shの * シェルコマンド言語
マウリシオ・Cアントゥネス

7
原則として、すべてのshスクリプトはposix互換性のおかげでbashの下で実行されますが、すべてのbashスクリプトはshの下で実行できるわけではありません。主な違いは、引用符なしのスペースを許可する[]比較ではなく[[]] $ []の代わりに$(())算術式、およびbash docsから直接「大きすぎて遅すぎる」などの他のこと。しかし、新しいスクリプト作成者は、一部を狙っているのでない限り、sh互換のスクリプトに限定する必要はありません。後方互換性。最近のほとんどのケースではそうではありませんが、結局のところ、それは2014年でした(または...)
osirisgothra 14年

回答:


1140

shとは

sh(またはシェルコマンド言語)は、POSIX標準によって記述されたプログラミング言語です。それは多くの実装を持っています(ksh88dash、...)。bashの実装と見なすこともできますsh(以下を参照)。

shは仕様ではなく実装なので/bin/sh、ほとんどのPOSIXシステムでの実際の実装へのシンボリックリンク(またはハードリンク)です。

バッシュとは

bashsh互換性のある実装として開始されました(ただし、POSIX標準より数年前にリリースされました)が、時間が経つにつれて多くの拡張機能を獲得しました。これらの拡張機能の多くは、有効なPOSIXシェルスクリプトの動作を変更する可能性があるため、それ自体bashは有効なPOSIXシェルではありません。むしろ、それはPOSIXシェル言語の方言です。

bash--posixスイッチをサポートしているため、スイッチはPOSIXに準拠しています。として呼び出されshた場合も、POSIXを模倣しようとします。

sh = bash?

長い間、ほとんどのGNU / Linuxシステムで/bin/sh使用されてい/bin/bashました。その結果、両者の違いを無視することがほぼ安全になった。しかし、それは最近変化し始めました。

/bin/sh指さない/bin/bash(そしてその中には/bin/bash存在しない場合もある)システムのいくつかの一般的な例は次のとおりです。

  1. デフォルトでシンボリックリンクshする最新のDebianおよびUbuntuシステムdash
  2. Busybox。これは通常、Linuxシステムのブート時にの一部として実行されますinitramfsashシェル実装を使用しています。
  3. BSD、および一般にLinux以外のシステム。OpenBSDは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 findFreeBSD findはどちらもサポートしています。

シバン線

最終的に、スクリプトの最初の行として«shebang»行を記述して、どちらを使用するかを決めるのはあなた次第です。

例えば

#!/bin/sh

を使用しますsh(そして、何がポイントされていても)、

#!/bin/bash

使用/bin/bash可能な場合に使用します(使用できない場合はエラーメッセージで失敗します)。もちろん、別の実装を指定することもできます。

#!/bin/dash

どちらを使用するか

私自身のスクリプトでshは、次の理由で私が好みます。

  • それは標準化されています
  • 学ぶのがずっと簡単で簡単です
  • POSIXシステム間で移植可能—たまたま持っていなくてもbash、持っている必要がありますsh

bash同様に使用する利点があります。その機能により、プログラミングがより便利になり、他の最新のプログラミング言語でのプログラミングに似ています。これらには、スコープ付きローカル変数や配列などが含まれます。プレーンshは非常にミニマルなプログラミング言語です。


bash構文エラーの場合に表示方法を使用してスクリプトを実行すると、より有用なエラーメッセージが表示されます。bashを使用すると、時間を節約できます。
PHPst

%コマンドラインの最初の意味は何ですか?
JosephHarriott

@JosephHarriottプロンプトです。シェル自体によって出力され、その後にコマンドが続きます。一部のシェルは、の$代わりに%、または#ルートシェルに使用します。
Roman Cheplyaka

@RomanCheplyakaどのシェル?私は今まで見てきた$#...
JosephHarriott

@RomanCheplyaka私は確かshにbash(これもボーンシェルの略)のかなり前に存在していた。しかし、それは非常に原始的であり、ESCキャラクターのような最終イベントには応答しませんでした。その後ksh(bashの前にも)登場し、bashはより良いシェルのアイデアを愛していたがkshを嫌っていた人々によって始められました。:-)
raminr

145

shhttp
bash : //man.cx/shhttp : //man.cx/bash

TL; DR:より洗練された構文とより多くの機能を備えbashたのスーパーセットですsh。最新のプラットフォームではユビキタスなので、ほとんどすべてのケースでbashシバンラインを使用しても安全です。

注意:一部の環境でsh ですbash。確認してくださいsh --version


31
bashがshとして呼び出された場合、動作は少し異なります。gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files( "shで呼び出された")およびgnu.org/software/bash/manual/bashref.html#Bash-POSIX-Modeを参照してください。たとえば、プロセス置換はありません。
グレン・ジャックマン、2011

11
bashはshのスーパーセットであり、FreeBSDなどの一部のOSにはデフォルトでbashがインストールされていないため、shでスクリプトを実行すると移植性が向上します。
user674062

1
特定のスクリプト用のPOSIXシェルを取得するための移植可能なスクリプト可能な方法はないため、移植可能なスクリプトはBourne Shellの機能以上のものを想定できません。
schily

83

この質問は、を使用しようshとして、と同じように動作しないことに驚いた人のために、正規の質問として頻繁に推薦されていbashます。ここでは、よくある誤解と落とし穴の簡単な概要を示します。

まず、何を期待するかを理解する必要があります。

  • あなたとあなたのスクリプトを実行した場合sh scriptname、またはでそれを実行scriptnameし、持っている#!/bin/sh中でシェバング行には、POSIXの期待すべきsh行動を。
  • あなたとあなたのスクリプトを実行した場合bash scriptname、またはでそれを実行scriptnameして持っている#!/bin/bashシェバング行に(または同等のローカル)、あなたはbashの振る舞いを期待するべきです。

一般的には、適切なシバンを用意し、スクリプト名(相対パスまたは完全パスを使用)だけを入力してスクリプトを実行することをお勧めします。正しいシバンに加えて、スクリプトファイルには実行権限(chmod a+x scriptname)が必要です。

では、実際にはどう違うのですか?

Bashリファレンスマニュアルには、違いを列挙しようとするセクションがありますが、いくつかの一般的な混乱の原因は次のとおりです。

  • [[は利用できませんsh[これはより不格好で限定されているもののみです)。
  • sh 配列はありません。
  • いくつかのバッシュのキーワードが好きlocalsourcefunctionshoptletdeclare、およびselectには移植できませんsh。(いくつかのsh実装は、例えばをサポートしlocalます。)
  • Bashには、3つの引数のfor((i=0;i<=3;i++))ループ、+=インクリメントの割り当てなど、多くのCスタイルの構文拡張機能があります。この$'string\nwith\tC\aescapes'機能は、暫定的にPOSIXで受け入れられています(つまり、現在Bashで機能しshますが、現在のバージョンにのみ準拠しているシステムではまだサポートされません。POSIX仕様であり、しばらくの間はないでしょう)。
  • Bashはをサポートしています<<<'here strings'
  • bashはあり*.{png,jpg}かつ{0..12}ブレース展開。
  • ~$HOMEBashでのみ参照されます(より一般的~usernameにはのホームディレクトリusername)。これはPOSIXにありますが、一部のPOSIX以前の/bin/sh実装にはない場合があります。
  • Bashは<(cmd)およびでプロセスを置き換え>(cmd)ます。
  • Bashには、&|for 2>&1 |&>for などのCshスタイルの便利なリダイレクトエイリアスがあります。> ... 2>&1
  • Bashは<>リダイレクトを伴うコプロセスをサポートしています。
  • バッシュは、次のような拡張された非標準パラメータ展開の豊富な特徴${substring:1:2}${variable/pattern/replacement}等、大文字と小文字の変換を、
  • Bashはシェル演算用に大幅に拡張された機能を備えています(ただし、浮動小数点のサポートはありません)。廃止されたレガシー$[expression]構文がありますが、POSIX算術$((expression))構文に置き換える必要があります。(ただし、一部のレガシーPOSIXより前のsh実装ではサポートされていない場合があります。)
  • マジック変数が好きで$RANDOM$SECONDS$PIPESTATUS[@]および$FUNCNAMEBashの拡張です。
  • export variable=valueやなどの構文の違い[ "x" == "y" ]は移植可能ではありません(export variable変数の割り当てとは別にする必要があり、移植可能な文字列比較で[ ... ]は単一の等号を使用します)。
  • オプションの動作を有効または無効にし、シェルの内部状態を公開するための多くの多くのBash専用拡張機能。
  • インタラクティブな使用のための多くの便利な機能ですが、スクリプトの動作には影響しません。

これは要約されたリストであることに注意してください。完全なスクープについてはリファレンスマニュアルを、多くの適切な回避策については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


2
基本的に、TL; DRはAndの答えです。
tripleee 2017年

4
shellcheck.netだけで十分でした。どうもありがとう。
Josh Habdas

FWIW、export variable=valuePOSIXによって義務付けられています:pubs.opengroup.org/onlinepubs/009695399/utilities/export.html。おそらくそれはいくつかの古代の殻では利用できませんが、バシズムではありません。
Roman Cheplyaka

53

UNIX.COMからの投稿

シェル機能

次の表は、シェルを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.

Bourne Shellの機能と1988年以前のkshの機能を比較しようとしているため、あなたのテーブルは私には役に立ちません。1988年のテーブルを本当に作成する場合は、bashを含め、他のほとんどのシェルをそのテーブルから削除する必要があります。 、sh、rc。テーブルの値はどこから取得したのですか?
schily

1
ヒントをいくつか教えてください:ジョブコントロールは1989年にボーンシェルに追加され、ボーンシェルは2005年にオープンソースになりました。コーンシェルは少なくとも1988年からプロセスに代わっており、1997年からオープンソースです。BTW:$ ENVに関するステートメント正しくありません。$ ENVは対話型シェルに対してのみ読み取り/実行されます。
schily

3
@schilyこの投稿はcs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.htmlからキャプチャされました
SriniV

@schilyどこかがおかしいと感じた場合は、自由に編集してください。
SriniV 2015

8
これは本質的に詐欺的であり、OPは彼が貼り付けた情報を実際に精査していなかったため、悪質な情報に基づいて、この回答を削除する方が良いと思われます。
danno 2015年

53

シェルは、オペレーティングシステムのサービスにアクセスするためのユーザーとOS間のインターフェースです。GUIまたはCLI(コマンドラインインターフェイス)のいずれかです。

sh(Bourne sh ell)は、Unix / Unixのようなオペレーティングシステム用のシェルコマンドラインインタープリターです。それはいくつかの組み込みコマンドを提供します。スクリプト言語では、インタープリターをと表し#!/bin/shます。これは、bash(無料/オープン)、kash(無料ではない)などの他のシェルで最も広くサポートされているものの1つでした。

BashB ourne a gain s hell)は、Bourneシェルのシェルの代替品です。Bashはshのスーパーセットです。Bashはshをサポートします。POSIXは、POSIX準拠システムの動作方法を定義する一連の標準です。Bashは実際にはPOSIX準拠のシェルではありません。スクリプト言語では、インタープリターをと表し#!/bin/bashます。

類推:

  • シェルは、インターフェース、仕様、APIのようなものです。
  • shは、Shellインターフェースを実装するクラスです。
  • Bashはshのサブクラスです。

ここに画像の説明を入力してください


3
わかりません。「Bashはshのスーパーセットである」と「Bashはshのサブクラスである」の両方について言及しましたが、それらは反対のステートメントではありませんか?明確にしていただけますか?
Keerthana Prabhakaran

11
これは、Bashがsh(したがって、OOPの意味での「サブクラス」)を継承し、それを拡張する(つまり、機能のスーパーセットを持っている)と言っていると思います。
トリプルリー

24

ターミナル

  • ウィンドウを開くプログラム
  • xterm、rxvt、konsole、kvt、gnome-terminal、nxterm、eterm。

シェル

  • 端末で実行するプログラムです
  • シェルはコマンドインタープリターであり、プログラミング言語でもあります
  • シェルは、単にコマンドを実行するマクロプロセッサです。
  • マクロプロセッサとは、テキストとシンボルを拡張してより大きな式を作成する機能を意味します。

SH対 バッシュ

SH

  • (シェル)
  • 特定のシェルです
  • コマンドインタープリターとプログラミング言語
  • BASHの前身

バッシュ

  • (ボーン・アゲイン・シェル)
  • 特定のシェルです
  • コマンドインタープリターとプログラミング言語
  • sh機能など
  • SHの後継者
  • BASHがデフォルトのシェルです

参考資料:

シェル 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プラットフォーム用に独立してサポートされているポートが存在します。


14

その他の回答では、一般にBashとPOSIXシェル標準の違いが指摘されています。ただし、移植可能なシェルスクリプトを記述してBash構文に慣れている場合は、典型的なバシズムと対応する純粋なPOSIXソリューションのリストが非常に便利です。このようなリストは、UbuntuがデフォルトのシステムシェルとしてBashからDashに切り替えたときにコンパイルされたもので、https//wiki.ubuntu.com/DashAsBinShにあります。

さらに、スクリプトのbashismをチェックするcheckbashisms と呼ばれる優れたツールがあり、スクリプトが移植可能であることを確認したい場合に便利です。


これは、基本的に、今のところ私の答えが実際に要約されていることです。+1
tripleee 2017年

7

それらはほとんど同一ですが、bashより多くの機能を備えていますsh(多かれ少なかれ)の古いサブセットですbash

sh()Bourne shellより前の1977年に作成されたオリジナルのを意味することがよくあります。しかし、実際には、1992年のPOSIX標準に準拠した相互互換性の高いシェルと考えるのがよいでしょう。bashBourne *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インストールされていません。


shPOSIXよりもはるかに古い。最近、あなたはshあなたが見つけたものが少なくともPOSIX互換であることを望みます。しかし、レガシーシステムでは、これは決して当然のことではありません。POSIXはシェルよりもはるかに安定しています。実際、オペレーティングシステムコールとライブラリ関数の標準化がより重要であると主張することもできます。
tripleee


3

/bin/shと同じプログラムを呼び出す場合と呼び出さない場合があり/bin/bashます。

sh少なくともPOSIXに必要な機能をサポートています(正しい実装を前提としています)。拡張機能もサポートする場合があります。

bash「Bourne Again Shell」は、shとbash固有の拡張に必要な機能を実装しています。拡張機能の完全なセットはここで説明するには長すぎるため、新しいリリースによって異なります。違いはbashマニュアルに記載されています。入力info bashし、「バッシュが機能」(現在のバージョンではセクション6)を読み取るか、読んでオンライン現在のドキュメントを


shPATH現在のシェルで適切に設定されている場合にのみ、POSIXシェルが提供されます。POSIXシェルを提供する定義済みのPATH名はありません。
2015

長い間、たとえば、SolarisのPOSIXシェルをsh必ずしも提供しいませんでした。
tripleee 2016

3

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であると想定するためです。


0

可能な限り簡単な違い: 基本的な理解があれば、上に投稿された他のコメントを見つけやすくなります。

シェル -「シェル」は、ユーザーとオペレーティングシステム(カーネル)間の対話を容易にするプログラムです。sh、bash、csh、zshなど、多くのシェル実装が利用可能です。

任意のシェルプログラムを使用して、そのシェルプログラムでサポートされているコマンドを実行できます。

バッシュは -それが由来B ourne- ゲインShは ELL。このプログラムを使用して、シェルで指定されたすべてのコマンドを実行できます。また、このプログラムに追加されたいくつかのコマンドを実行できます。Bashにはshとの下位互換性があります。

Sh-ボーンシェルから派生。「sh」は、シェルで指定されたすべてのコマンドをサポートします。つまり、このプログラムを使用すると、Shellで指定されたすべてのコマンドを実行できます。

詳細については、実行します - https://man.cx/sh - https://man.cx/bash


POSIXを理解するには、Alexからの応答を読んで ください。確認してください:stackoverflow.com/a/1780614/1261003
Raihanhbh

私はPOSIXを理解しようとはしていません。私はあなたの回答を確認しています。そのため、あなたの回答が付加価値を与えることを確認する必要があります。そうは思いません。
スクラッチ

これらの小さな説明は、初心者が上記の議論で使用されている専門用語をより快適に理解するのに役立つと思います。@Scratte
Raihanhbh

-1

Linuxオペレーティングシステムは、さまざまなタイプのシェルを提供します。シェルには多くの共通のコマンドがありますが、各タイプには固有の機能があります。主に使用されているさまざまな種類のシェルを調べてみましょう。

Shシェル:

Shシェルはボーンシェルとも呼ばれます。Shシェルは、1977年にAT&TのBell LabsでStephen BourneによってUnixコンピュータ用に開発された最初のシェルです。多くのスクリプトツールが含まれています。

バッシュシェル:

BashシェルはBourne Again Shellの略です。Bashシェルは、ほとんどのLinuxディストリビューションのデフォルトシェルであり、Shシェルの代わりになります(ShシェルはBashシェルでも実行されます)。Bash Shellは、Shシェルスクリプトの大部分を変更せずに実行でき、コマンドライン編集機能も提供します。


ケントンプソンによる以前のシェルがありました。Bourneシェルは、v7 Unix(1979)で正式に導入されました。
tripleee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.