追加読書

追加読書

私が見たほとんどのシェルスクリプト(自分で書いていないスクリプトを除く)からshebangが#!/bin/sh。も存在します。

これがほとんどどこにあり、多くのLinuxおよびBSDシステムでデフォルトとして使用されることが多いので、/bin/shこれを好む理由はありますか?/bin/bashbash

答え1

  1. 一部のシステムはデフォルトでbashを提供しません(FreeBSDなど)。
  2. bashがインストールされていても、.bashに配置されない可能性があります/bin
  3. ほとんどの単純なスクリプトにはbashは必要ありません。
  4. POSIX シェルを使用すると、より移植性が高く、スクリプトをよりさまざまなシステムで実行できます。

答え2

Linux(Debian関連:Ubuntu、Mintなど)のほとんどのシステムスクリプトは、これらのシステムのデフォルト/ bin / shであるより速いダッシュで実行するように書かれています。 2つの理由があります:

  • システム速度。ダッシュコードが小さいほど、読み込みが速くなり、実行が速くなります。シェルスクリプトプログラマ側では、少し(小さな?)追加の労力(費用)が必要です。

  • 安全。さまざまな殻は虫を防ぐのに役立ちます。 Debian システムは、デフォルトのシェルにはそのような脆弱性がないため、ほとんどの場合シェルショックに対して脆弱ではありません。

Bashは実際にはデフォルトのシェルですユーザーこれは、より強力でコーディングを容易にする要素が多いためです。これはshMac OSのデフォルトでもあります(/ bin / shで接続されています)。しかし、bashリンク名で呼び出すと、shposix互換シェルで始まります。

答え3

他の人々は、この質問の前提は、Bourne Againシェルが基本であり、どこにも存在するということであり、これは完全に偽であると指摘しました。

それに加えて、シェルスクリプトを解釈するためにBourne Againシェル以外のツールを使用するには良い理由があります。このため、大規模なUbuntuとDebianプロジェクトは、bashismを削除し、システムの初期化で実行される可能な限り多くのシェルスクリプトを作成するために長年努力してきました。たくさんシステム5シェルスクリプトrc)とパッケージのインストールと削除を使用してDebian Almquist シェルBourne Againシェルの代わりに。

簡単に言えば、Bourne Againシェルはインタラクティブな機能でいっぱいですが、POSIX準拠のシェルスクリプトの最速のシェルソルバーではありません。したがって、シェルスクリプトをPOSIXと互換性があり、より軽いプログラム(Debian Almquistシェルなど)を使用してそれらを解釈できる場合は、システムのパフォーマンスが向上します。 (最終的にDebianはあまりにも深く組み込まれていて、広すぎて削除するのに役立つPOSIXではなく、複数のシェル構成のサポートを追加するためにAlmquistシェルを少し調整する必要がありました。)

この結果、ブートパフォーマンスが大幅に向上しました。

したがって、考慮すべき2種類のシェルがあります。

  • すべての素晴らしいインタラクティブ機能を備えたシェルは、次のように構成されています。対話型ログインシェルアカウントデータベースのユーザー用です。
  • 多数のスクリプトをすばやく解釈するシェルで、次のように使用されます。スクリプトインタプリタシェルスクリプトを介して。

これを「好み/bin/sh」と呼ぶのは過度に単純化されたものです。 Debianは実際には少なくとも二つターゲット:

  1. Debian Almquistシェル、Zシェル(POSIXモード)、Bourne Againシェル(POSIXモード)、MirBSD Kornシェル、およびその他のシェルを使用する管理者には/bin/sh2つのオプションがあります。

    1. /bin/sh...マッピングターゲットを切り替えても問題が発生しないように、スクリプトをできるだけ移植可能にします。

    2. ...移植性のないスクリプトを明示的に配置する正しい通訳/bin/sh、単にマッピングを期待するのではなく。

  2. /bin/shBourne Shellの代わりにDebian Almquistシェルをデフォルトのマッピングにして、そのスクリプトをはいPOSIX準拠(またはより正確にはDebianポリシーマニュアルに準拠)がより速く実行されます。

もちろん、現場に入ると、はるかに遠くに行くことができます。たとえば、シェルスクリプトやコンパイルされたプログラムなどの効率的なバランスを検討してください/bin/true/usr/bin/clearしかし幸いなことに、これはこの答えの範囲外です。 ☺

もちろん、これらのどれも新しいものではなく、Unixに限定されていません。世紀が変わるずっと前に、私は「対話型」と「非対話型」の両方の特性を持つコマンドラインソルバーを作成してリリースしましCOMSPECOS2_SHELL。同様に、Debian System Vでbashismとパッケージのインストール/削除スクリプトを削除することについての議論はrc1990年代にさかのぼります。

追加読書

答え4

より強力で人間工学に基づいた言語でスクリプトの代わりにシェルスクリプトを作成する唯一の理由は次のとおりです。未知のソフトウェアセットがインストールされたレガシーシステムへの移植性は、他のどの要素よりも重要です。

/bin/shこれは、自分をUnixと呼ぶすべてのユーザーが使用できる唯一のスクリプトソルバーです。ただし、多くのレガシーシステムでは、関連/bin/shユーティリティは最新の仕様だけでなく、POSIX.1-1996「シェルとユーティリティ」の仕様にも準拠していません。互換ツールは、/usr/xpg4目立たない場所にインストールされるオプションのアドオンです。 1 移植可能なサブセットシェル言語でスクリプトを作成する は、POSIX シェル言語でスクリプトを作成するよりも面倒でエラーが発生しやすくなります。 (私の言葉を信じられない場合は、configureAutoconfが生成したスクリプトを時々読んでください。設定だけで十分に納得できます。)

しかし、仮定できれば他のスクリプトインタプリタインストールされている場合(Bashなど)、通訳者を使用できます。より良いスクリプト言語インストールされました。たとえば、PerlもっとおそらくBashよりも便利です。

だからあなたはいいえスクリプト#! /bin/bash。それがオプションなら、より良い言語もオプションだからです。

1たとえば、Solaris 10 以前ではオリジナル Bourne シェルのように/bin/sh。 Solaris 11からksh93にアップデートしたことがわかりました。

関連情報