なぜ./filename
Linuxでファイルを実行するには?
他のコマンドgcc
、ls
などのように入力するだけではどうですか。
文字通りの答えは、他の人が示したとおりです。現在のディレクトリが$PATH
にないためです。
しかしなぜ?要するに、それはセキュリティのためです。他の人のホームディレクトリ(または/ tmp)を調べてgcc
またはls
と入力すると、悪意のあるバージョンではなく、実際のディレクトリを実行していることを知りたいいたずら友達があなたのすべてのファイルを消去することを書いた。別の例はtest
または[
で、シェルに組み込みのコマンドがない場合、シェルスクリプトのコマンドをオーバーライドする可能性があります。
パスのlastエントリとして.
を使用することは少し安全ですが、それを利用する他の攻撃もあります。簡単なのは、sl
やls-l
などの一般的なタイプミスを悪用することです。または、たまたまこのシステムにインストールされていない一般的なコマンドを見つけます—たとえば、vim
。これは、sysadminsが入力する可能性が平均より高いためです。
つまり、なぜ最初に./が必要なのですか-これは(Windowsとは異なり)、デフォルトでは現在のディレクトリがパスの一部ではないためです。実行すると:
$ ls
シェルはPATH環境変数(それを表示するにはecho $PATH
)内のディレクトリでls
を探し、検出したls
という最初の実行可能ファイルを実行します。入力した場合:
$ a.out
シェルも同様に動作しますが、おそらくa.outという実行可能ファイルは見つかりません。シェルにa.outの場所を通知する必要があります-それは現在のディレクトリ(。)にあり、パスは./a.out
です。
「a.out」と呼ばれる理由を尋ねる場合、それはgccのデフォルトの出力ファイル名にすぎません。 -oコマンドライン引数を使用して変更できます。例えば:
$ gcc test.c -o test
$ ./test
$ PATH変数に:.
を追加してみてください。
Linux/GTKを実行している場合は、ALT + F2を入力して次のように入力します(Ubuntuを使用している場合はgksudo gedit /etc/environment
)。
ただし、これを行わないことを強くお勧めします。それは悪い悪い悪い悪いです。
1970年以降、この種の機能はこのように機能します。現在のディレクトリが$ PATHに含まれていないのには理由があります。
.
は現在のディレクトリです
.something
は隠しファイルです(「ALT +」と入力してNautilusに表示するか、「ls -la
」を試してください。
./someProgram.sh
は、現在のディレクトリで実行可能なsomeProgram.shを実行するために入力するものです。
.somethingElse
は、現在のディレクトリに隠し実行可能ファイルがあることを意味しますが、これは悪い考えです。
実際には、より完全なルールは、スラッシュ/
がパスにある場合は、検索しないでくださいPATH
根拠に入る前に、まずこの事実について知っておく必要があります。
bin/someprog
または:
/bin/someprog
または:
cd bin
./myexec
まったく同じ理由で、PATH
変数を検索せずにbin/someprog
を実行します。bin/someprog
、/bin/someprog
、および./someprog
にはすべて、スラッシュ/
が含まれています。
someprog
だけではスラッシュ/
がないため、PATH
のみを検索します。
POSIX 7 は、このルールを http://pubs.opengroup.org/onlinepubs/9699919799/utilitiesで指定します/V3_chap02.html#tag_18_09_01_01
/
POSIX PATHルールの根拠
次のように実行するとします:
someprog
検索します:
次に、ディストリビューションから/bin/someprog
を実行する場合、次のようにします。
someprog
他の無関係なsomeprog
プログラムが含まれているディレクトリにいる可能性があるため、動作することもありますが、失敗することもあります。
したがって、これは信頼できないことをすぐに理解し、PATHを使用したい場合は常に絶対パスを使用することになり、PATHの目的が無効になります。
これはまた、PATHに相対パスを含めることが非常に悪い考えである理由でもあります。私はあなたを見て 、node_modules/bin
です。
逆に、以下を実行するとします。
./someprog
検索します:
次に、スクリプトsomeprog
をgitリポジトリからダウンロードしてCWDから実行したい場合、これが実際に実行されるプログラムであるかどうか確信が持てません。
/bin/someprog
これは、昨年のクリスマスの後に飲みすぎた後にインストールしたパッケージのPATHに含まれています。
したがって、繰り返しますが、実行しているものを知るために、フルパスを使用してCWDに相対的なローカルスクリプトを常に実行する必要があります。
"$(pwd)/someprog"
これも非常に煩わしいでしょう。
思いつきそうなもう1つのルールは次のとおりです。
相対パスはPATHのみを使用し、絶対パスはCWDのみを使用します
ただし、これでもユーザーは"$(pwd)/someprog"
を使用して、PATH以外のスクリプトに常に絶対パスを使用する必要があります。
/
パス検索ルールは、about問題の覚えやすい解決策を提供します。
PATH
は使用しないでくださいPATH
のみを使用これにより、現在のディレクトリ内のファイルは./somefile
またはsomefile
のいずれかとして表現できるという事実に依存することで、実行中の内容を常に非常に簡単に知ることができるため、それらの1つに特別な意味を与えます。
時々、PATH
に対してsome/prog
を検索できないのは少し面倒ですが、これに対するより正解はありません。