ファイルを実行するためにLinuxを使用するのはなぜですか./filename
?
ただ他のコマンドのように入力したらどうでしょうかgcc
?ls
答え1
リテラルの回答は他の人が提供したものと同じです。現在のディレクトリが$PATH
。
しかし、なぜ?一言で言えば安全についてです。他の人のホームディレクトリ(または/ tmp)を表示または入力するgcc
と、いたずらls
友達が作成した悪意のあるバージョンではなく、実際のバージョンを実行しているので、すべてのファイルを削除できることがわかります。別の例はtest
またはです[
。シェルにこれらのコマンドが組み込まれていない場合は、シェルスクリプトでこれらのコマンドを置き換えることができます。
.
〜で持っている最後自分のルートに入る方が安全ですが、それを利用する他の攻撃もあります。これを行う簡単な方法は、sl
などの一般的なスペルミスを活用することですls-l
。または、そのシステムにインストールされていない一般的なコマンドを見つけます。vim
たとえば、システム管理者が平均よりも頻繁にコマンドを入力するためです。
とても理論的に聞こえますか?それ最大はい、しかし実際には特にマルチユーザーシステムでこれが間違いなく起こります。実際、以下は、このウェブサイトの例です。管理者はユーザーのホームディレクトリに切り替えて、ps
その名前の実行可能ファイルがブロックされていることを見つけます。
答え2
答え3
もしそうなら、最初に./が必要なのは、(Windowsとは異なり)現在のディレクトリがデフォルトでパスの一部ではないからです。実行する場合:
$ ls
ls
シェルは、PATH環境変数のディレクトリを見て(echo $PATH
確認するために)見つけた最初の実行可能ファイルを実行しますls
。次のように入力する場合:
$ a.out
シェルは同じことを行いますが、a.outという実行可能ファイルを見つけることができない可能性があります。 a.outがどこにあるかシェルに教えてください。現在のディレクトリ(.)にある場合、パスはです./a.out
。
なぜ「a.out」と呼ばれるのかを尋ねるなら、それはgccのデフォルトの出力ファイル名にすぎません。 -oコマンドラインパラメータを使用して変更できます。たとえば、
$ gcc test.c -o test
$ ./test
答え4
実際、より完全なルールは次のとおりです。/
パスにスラッシュがある場合は検索しないでください。PATH
どのように機能するかを知る前に、まず次のことを理解する必要があります。次のいずれかを実行してください。
bin/someprog
または:
/bin/someprog
または:
cd bin
./myexec
を実行するときに変数をbin/someprog
検索する必要はありません。まったく同じ理由でallであり、その中にスラッシュがあります。PATH
bin/someprog
/bin/someprog
./someprog
/
someprog
aloneにはスラッシュがないので、/
でのみ検索しますPATH
。
POSIX 7以下にこの規則を指定します。http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
道
[...]探しているパス名にが含まれている場合は、
<slash>
パスプレフィックスで検索しないでください。
/
POSIX PATH ルールの基本
実行中であると仮定します。
someprog
次を検索します。
- CWDに関連する最初の
- 以降のPATH基準
/bin/someprog
その後、ディストリビューションで実行するには、次の手順を実行します。
someprog
時には動作しますが、someprog
関連していない他のプログラムが含まれているディレクトリにある可能性があるため、失敗することがあります。
したがって、これが信頼できないことがすぐにわかり、PATHを使用したい場合は常に絶対パスを使用することになり、PATHの目的は失われます。
これがPATHに相対パスを含めることが非常に悪い考えである理由です。はいあなたを見ている、node_modules/bin
。
代わりに、以下を実行するとします。
./someprog
次を検索します。
- PATHに相対する最初の
- 以後、CWD基準
その後、someprog
gitストアからスクリプトをダウンロードしてCWDで実行したい場合は、ディストリビューションに次のものがある可能性があるため、これが実行される実際のプログラムであるかどうかはわかりません。
/bin/someprog
これは、過去のクリスマスに飲みすぎた後にインストールしたいくつかのパッケージのPATHです。
したがって、実行中のエントリを確認するには、フルパスを使用してCWDに基づいて常にローカルスクリプトを実行する必要があります。
"$(pwd)/someprog"
これも非常に面倒なことができます。
考えられるもう一つの規則は次のとおりです。
相対パスはPATHのみを使用し、絶対パスはCWDのみを使用します。
ただし、これにより、ユーザーはPATH以外のスクリプトに常に絶対パスを使用する必要があります"$(pwd)/someprog"
。
ルート/
検索ルールは、情報の問題に対する簡単で覚えやすいソリューションを提供します。
- スラッシュ:未使用
PATH
- スラッシュなし:単に使用してください
PATH
これにより、現在のディレクトリ内のファイルを介して./somefile
実行されている項目がまたはとして表示されることがあることを常に簡単に知ることができるため、somefile
そのうちの1つに特別な意味を与えます。
some/prog
時には何かを探すことができず、少し迷惑になることがありますがPATH
、よりスマートな解決策は見えません。