* nixシステムで./prognameを使用してプログラムを実行するのはなぜですか?


5

私はLinuxとMacをしばらく使ってきましたが、どうしてこんなようなプログラムを実行しなければならないのでしょうか./progname。Unixはすべてのものをファイルとして扱い、ファイルのiノード番号を指すテーブルにファイル名を保存することを知っています。

しかし、どうabc.py違い./abc.pyますか?

回答:


24

./abc.pyabc.py現在のディレクトリにあるファイルを実行する」という意味です。

abc.pyabc.pyシェルのディレクトリ検索パスで最初に見つかったファイルを実行する」という意味です。


10
多くの場合、現在のディレクトリが検索パスにないため、これは関連性があり、実行しようとするabc.pyとエラーが発生します。
ハビエル

7
また、人々が「./」を使用する主な理由は、現在のディレクトリを検索対象のディレクトリのパスに含めることはセキュリティ上の脆弱性とみなされるため、通常は現在のディレクトリが検索されることを期待せず、通常はそうしないことです置く PATHで。
ウィリアムパーセル

16

abc.pyコマンド検索パス(PATH環境変数で指定されたディレクトリの1つ)にある必要があります。./abc.pyは正確なパスです。abc.py現在のディレクトリ(.)から実行されます。

Unixの世界では、一般的なUnixコマンド(または一般的なスペルミス)にちなんで名付けられた実行可能ファイルが誤って実行される非常に単純な悪意のある攻撃を許可するため、パスに現在のディレクトリを置くことは悪い習慣と見なされます疑いを持たないユーザー。

たとえば、ありそうもないが、最も例証的な例は、攻撃者がrmin という名前の実行可能ファイルを残し、/tmpシステム管理者が/tmpディレクトリを空にしようとするのを待つ場合です。


5

OSは、$ PATH変数にリストされているすべてのディレクトリで実行するプログラムを探します。通常、ローカルディレクトリ「./」はPATHにありません。追加することはできますが、これにはセキュリティ上の意味があります。

PATHに「./」を追加すると、誰かが「vi」というプログラムをディレクトリに配置し、誰かがviを使用してこのディレクトリ内の何かを編集しようとするのを待つことができます。だまされました...シングルユーザーシステムでは、これは深刻な問題ではないかもしれませんが、それでも悪い習慣です。


2
実際には、OSではなく、コマンドシェルです。
マルチン

2
@Marcin:状況によります。シェルは(後でキャッシュするために)自分でルックアップを行う傾向がありますが、プログラムはのexecvp()代わりにを使用してOSに引き渡すことができexecv()ます。
-grawity

トリックが機能するの.は、パスの最後ではなく、最初にある場合のみです。
-grawity

@grawity:私は訂正しました。
マルチン

0

現在の作業ディレクトリ(CWD)が$ PATHにない場合、。/ prognameとして呼び出す必要があります。CWDが$ PATHにある場合、 'progname'形式の呼び出しは正常に機能します。


-1

./abc.pyを実行する必要があるのは、次の場合のみです。$ pathにありません。$ pathは、コマンドとしてコマンドを入力したときにプログラムを探す場所をシェルに指示する環境変数です。必要に応じて、特定の場所が組み込まれた別のシェルを使用できます。


1
@Jefromi:申し訳ありませんが、どのシェルIまたはOPが使用しているのかをどのようにして知るのですか?
マルチン

5
@Marcin:それはシェルの問題ではありません。それはPOSIXです。「大文字と小文字は一意のIDを保持し、一緒に折り畳まれません。小文字を含む環境変数名の名前空間は、アプリケーション用に予約されています。」シェルで大文字と小文字が区別されない場合、シェルは破損しています。bash、dash、sh、ksh、zsh、tcsh、またはcshではありません。それらのいずれかを使用していない* nixユーザーを見つけるのは幸運です。
カスカベル

2
さらに、POSIXは言う:「IEEE規格1003.1-2001の環境変数シェルでユーティリティで使用される名前とユーティリティボリュームが...大文字、数字、 『_』(アンダースコア)でのみなる」と明示的に言及PATHし、どのような意味するはずです。
カスカベル

4
私は100%POSIXコンプライアンスについて話しているのではなく、誰もが準拠しているこの小さな部分へのコンプライアンスについて話しているのです。重要なのは標準ではなく実践であるという議論をするなら、実際には大文字と小文字を区別しない* nixシステムを見つけてください。(いいえ、それは単なるシェルの問題ではありません-基礎となるシステムが関係しています。)
カスカベル

6
ここでのnitpickingに費やされたエネルギーは、$ pathを置き換える$PATHことで、包括的な答えを書くのに役立ちました。ちょうど言って:
サムホセバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.