shとbashの違い 質問する

shとbashの違い 質問する

シェルプログラムを書くとき、/bin/shと をよく使います/bin/bash。私はたいてい を使うのですbashが、それらの違いがわかりません。

Bash と の主な違いは何ですかsh?

Bash でプログラミングするときに注意する必要があることは何ですかsh?

ベストアンサー1

shとは何ですか?

sh(またはシェルコマンド言語)は、POSIX標準さまざまな実装があります(ksh88ダッシュsh、...)。Bash は、 (下記参照)の実装とも考えられます。

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

Bashとは何ですか?

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

Bash は--posixスイッチをサポートしており、これにより POSIX 準拠性が高まります。 として呼び出された場合も、POSIX を模倣しようとしますsh

sh = bash?

長い間、ほとんどの GNU/Linux システムでは/bin/shを指していました/bin/bash。その結果、両者の違いを無視してもほぼ安全になりました。しかし、最近になって状況が変わり始めました。

/bin/shが指していないシステム/bin/bash/bin/bash存在しないシステムもある)の一般的な例は次のとおりです。

  1. デフォルトshシンボリックリンクする最新の Debian および Ubuntu システム。dash
  2. ビジーボックスこれは通常、Linuxシステムの起動時に の一部として実行されますinitramfsシェルの実装。
  3. BSDA のシステム、および一般に Linux 以外のシステム。オープンBSDpdkshの子孫であるコーンシェルFreeBSD はshオリジナルの Unix Bourne シェルの後継です。ソラリス独自の実装があります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検索そしてFreeBSD 検索それをサポートします。

シェバンライン

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

例えば

#!/bin/sh

使用するものsh(そしてそれが指すもの)

#!/bin/bash

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

#!/bin/dash

どれを使うか

sh私自身のスクリプトでは、次の理由からこれを好みます。

  • 標準化されている
  • はるかにシンプルで簡単に学べます
  • POSIXシステム間で移植可能であり、たとえPOSIXシステムが持っていなくてもbashsh

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

おすすめ記事