回答:
Bash(bash
)は、多くの(まだ最も一般的に使用されている)Unixシェルの1つです。Bashは「B ourne A gain SH ell」の略で、元のBourneシェルの置き換え/改良です(sh
)。
BashスクリプトはBash専用のスクリプトですが、シェルスクリプトは任意のシェルでのスクリプトです。ただし、実際には、問題のシェルがBashでない限り、「シェルスクリプト」と「bashスクリプト」はしばしば同じ意味で使用されます。
編集:実際には、Ubuntuのデフォルトのスクリプティングシェルはダッシュですが、デフォルトのインタラクティブシェル(ターミナルを引き上げると得られるもの)はBashです。それにも関わらず、2つの用語はまだほとんど互換性があります。
/bin/sh
を/bin/dash
作成するためのシンボリックリンクであるという事実は、デフォルトのスクリプトシェルではありません。つまり、絶対に使用しなければならない規則は書かれていません。1が使用している場合、あなたのスクリプトが持っているほとんどが複数のUnixライクなOSプラットフォーム上で使用されることを期待する場合には、移植性の理由のために主にPOSIX準拠の、ボーンファミリーシェルとして。/bin/sh
/bin/sh
/bin/sh
前書き
シェルスクリプトとBash
スクリプトは同じものではありませんsh
。スクリプトを実行するために使用できるシェルなど、他のシェルが存在するためです。実行することを意図しBash
たBash
スクリプトは、スクリプトとしてラベル付けする必要があります。にBash
比べて機能が拡張されているためsh
、多くのディストリビューションでユーザースクリプトを実行するために最も一般的に使用される用語であるため、この用語はしばしば同じ意味で使用されます。しかし、のような他のシェルがありKorn (ksh)
、C shell (csh)
そしてZ shell (zsh)
、私たちはの議論として、ここではそれらの中に入ることはありませんsh
し、bash
Ubuntuのに最も関連しています。ここでの IBMの素晴らしい記事では、Linuxでのシェルの進化について詳しく説明し、シェルアーキテクチャとシェルの違いについて詳しく説明しています。
シェルスクリプト
Sh
Stephen Bourneによって開発された元のUnixシェルでした。しかし、DebianのシステムをベースとUbuntuを考慮dash
そのようにsh
シェル(sh
実際にシンボリックリンクされていますdash
)。DebianおよびUbuntuでは、の速度によりsh
、重要なシステムプロシージャや起動時の主要なスクリプトの実行によく使用されます。詳細については、Ubuntu wikiを参照してください。 Bash
Bourne Again SHellの略語であり、後でブライアンフォックスによって開発され、オリジナルを大幅に拡張しましたsh
。Foxと他の人の開発はBash
GNUプロジェクトの重要な部分でした。詳細については、歴史に関するこのすばらしい議論Bash
をご覧ください。
Ubuntuや他のディストリビューションで使用されているように、sh
との両方Bash
がPOSIX
準拠していることに注意することが重要です。つまり、シェルでのコマンドの実行方法に関する多くの標準に加入しています。これはPOSIX
、開発者にとって特に重要であるため、OSで使用されるスクリプトの結果を確実に予測でき、シェルの動作をこれらのパラメーター内に保持できるようにするためです。標準の詳細については、公式ドキュメントを参照してください。
多くの場合、シェルスクリプトは、スクリプト.sh
として実行されることを目的bash
としており#!/bin/bash
、スクリプトの先頭にサフィックスが付いています。スクリプトの名前がscript.shかmy.scriptかは問題ではなく、インタプリタへの呼び出しが/bin/sh
or かどうかが重要です/bin/bash
。シェルスクリプトは、sh
またはのいずれかを使用してコマンドラインで呼び出すこともできますbash
。
ただし、すべてのコマンドがで機能するわけではないため、ほとんどのコマンドがで機能するため、どのインタープリターが呼び出されるかによって結果が異なる場合があることに注意することが重要です。一般に、ほとんどのユーザーは、拡張機能セットを利用できるように、スクリプトに使用したいと思うでしょう。必要に応じてシステムスクリプトを実行できます。bash
sh
sh
bash
/bin/bash
/bin/sh
Bash Shellスクリプトのリソース
良い慣行に従って、有用なスクリプトを作成できるアドバイスを提供する有用なリソースをオンラインで見つけるのは難しい場合があります。その後man bash
、最も重要なリソースのいくつかは、Gregのwiki、Bashハッカー、および主にBash
O'Reillyによって出版されているShellスクリプトに関するSteve Parkerの最近の本です。また、Bash初心者向けガイドで優れた紹介を行っています。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr 3 08:58 /bin/bash*
これは、「sh」が「dash」へのシンボリックリンクであり、Ubuntuのデフォルトの対話型シェルである/ bin / bashが/ bin / shのほぼ9倍の実行可能ファイルであることを示しています。
実際、「man sh」(1590行)と「man bash」(5459行)は、bashが従来の「sh」の大きなスーパーセットであることを示しています。
詳細はこちら:
シェルスクリプトは、POSIX準拠のOSのシステムシェルで実行できる移植性指向のスクリプトとして定義されます。構文は、POSIX標準で定義されているシェルスクリプト言語の構文と同一または類似しています。これは、Linux / Unix / * BSDなどのほとんどのPOSIX互換OSの標準です。POSIXは、オペレーティングシステム間の互換性の最も一般的な根拠です。
前述とは異なるOSは、非対話型の使用のために異なるシェルを実装します(つまり、システムスクリプトまたは#! /bin/sh
shebang を使用するスクリプトを実行します)。パフォーマンス上の理由から、POSIXグラウンドでは、さまざまなPOSIX準拠のOs向けに設計されたスクリプトの非常に高いレベルの移植性が考慮されています。
前述のほとんどのOSには、通常はフル機能のbashである独立した対話型シェルがあります。Bashは大部分がPOSIX準拠ですが、追加のコマンドの大きなプールもあり、さまざまな構文をサポートしています。--posixコマンドラインオプションでBashを起動するか、Bashの実行中に 'set -o posix'を実行すると、Bashがデフォルトの領域でPOSIXによって指定された動作に一致するように動作を変更することにより、BashがPOSIX標準により厳密に準拠するようになります異なります:https : //www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.htmlを参照してください
シェルの実行可能ファイルの配置に関する統一ルール(通常は「/ bin /」ディレクトリにあります)のおかげで、シェルスクリプトを作成するための統一ルールを作成できます。具体的には、シェバン式に指定するパスを明確にします。スクリプトを実行する適切なシェル実行可能ファイル。Unix / Linux / * BSDファイルシステムは拡張子を本質的にサポートしていないため、ファイル拡張子は追加のヒントとして、またはインデックス作成の目的でのみ使用されます。
Debian / Ubuntuでは、具体的にbin/sh
はbin/dash
、ダッシュシェルの実行可能ファイルを指すシンボリックリンクです。これにより、ダッシュがシステムシェルになります。これは、より機能的なbashよりも4倍高速で、サイズが1/10であると推定されます。ソース:https : //unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash
Debianの/ Ubuntuの対話型端末は、パスも均一であるため、他の多くのUnixライクなオペレーティングシステム、bashの、のように、デフォルトでは次のとおりです/bin/bash
。
POSIX.1-2017標準:http : //pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
コマンドまたはオプションがPOSIXで定義されていない場合
#! /bin/sh
、最初にスクリプトに入れないでください 。
スクリプトをbashからPOSIXフォームに変換するには、シェルスクリプトのバグを自動的に確認するか、POSIX互換にするためにbashスクリプトの変更を確認する必要があります。