「sh」は「/ bin」ディレクトリにある必要がありますか?


16

POSIX準拠のオペレーティングシステム(Linuxなど)にはshシェルが必要であると読みました。

しかしsh/binディレクトリにある必要がありますか、それとも任意のディレクトリにあることができますか?


シンボリックリンクはいつでも使用できます。/bin/shほとんどの場合、Linuxでは、すでにシンボリックリンクになっていbashます。多くのスクリプトがハードコーディングを使用しているだけです/bin/sh
-cylgalad

5
希望の場所に住むことができるという答えが得られたので、次のことを自問するかもしれませshん。そして、答えは次のとおりです。シェバンもPOSIXの一部ではないため、問題自体は存在しません。
ヨルグWミットタグ

1
@JörgWMittagはい、「標準の」Unix機能と考えられるものの多くがPOSIXで実際に必要とされないのは驚くことです。
バーマー

1
シバンを使用するかどうかは、パス/bin/shがPOSIXシステムに存在する必要があるかどうかとは無関係です。
chepner

少なくともUbuntuから派生したシステムで/bin/shは、へのリンクdashです。BSDでは/bin/sh、リンクではなく、別個の実行可能ファイルであり、確かにそうではありませんbash
Rhialtoはモニカをサポートします

回答:


22

POSIXは唯一の義務付け/dev/tmp存在するディレクトリを、そして/dev/null/dev/tty、および/dev/consoleファイル。標準ユーティリティが存在する必要がありますが、特定の場所は指定されていません。が存在しない/bin場合があり、存在する場合はを含まない場合があり、存在する場合はshPOSIXではない場合がありますsh

あなたは、有効な取得することができますPATHを含む、POSIXツールを含む変数shで、getconfコマンドを

$ PATH=$(getconf PATH)
$ sh

これは、たとえば、デフォルトshがPOSIX互換はない Solarisで役立ちます、そのように準拠しているものshが提供され、アクセスできます(Solarisは認定Unixであるため)。getconf PATH含まれる/usr/xpg4/binPOSIX含まれているフロント、でshと(他に必要なツールの数のような役に立たないものを含むがcd)。


Re Solaris:...多くのPOSIXツールを省略したSolaris「スモールサーバー」インストールを実行している場合を除きます。参照してくださいunix.stackexchange.com/q/360359/135943
ワイルドカード

「役に立たない」もの?私はむしろそれらを冗長と呼びたいです。
ムケシュサイクマール

2
それでは、getconfはどのように見つけられますか?
ジョシュア

@MukeshSaiKumarスタンドアロンの「cd」コマンドは機能しません
OrangeDog

まあ、それは、たとえば、ディレクトリに変更できるかどうかをテストするが、実際にそこに呼び出したプロセスを残さないという作業の値に対してのみ「動作」します。ただし、機能はまったくないよりも機能が多くなります。
チャールズダフィー

12

いいえ、それはのために必要とされていないsh中であることを/bin。これは、明示的に引用している/bin/usr/bin/usr/xpg4/binの可能な場所として。POSIX仕様では、それshがPATHにあることのみが必要です。

POSIX仕様の状態:

アプリケーションは、シェルへの標準PATHがまたはであると想定できないことに注意する必要があります。/bin/shまた/usr/bin/sh、getconf PATHによって返されるPATHの問い合わせによって決定される必要があります。

たとえば、標準のshユーティリティの場所を特定するには:

command -v sh

いくつかの実装では、これは以下を返します:

/usr/xpg4/bin/sh


2

ここで他の人が言ったように、これはPOSIX準拠のために厳密には必要ありません。

しかし、おそらく既存のソフトウェアとの互換性ははるかに重要です(結局、POSIXの目的は、すべての準拠オペレーティングシステムで特定の機能を動作させることです)/bin/sh

最も明らかに、スクリプトは#!/bin/sh標準化されているこのパスに依存しています。これは動作するために必要ではありません。POSIXでは#!、そのような機能が一般的であることに言及していますが、行をサポートする必要さえありません

一部の歴史的な実装がシェルスクリプトを処理するもう1つの方法は、ファイルの最初の2バイトを文字列「#!」として認識することです。ファイルの最初の行の残りを、実行するコマンドインタープリターの名前として使用します。

しかし、それがサポートされていない場合、既存のソフトウェアの多くが壊れたり、移植するために追加の作業が必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.