Linuxでファイルを実行するために./filename
を使用するのはなぜですか?
なぜですか?他のコマンドのように入力するだけですgcc
、ls
など…
コメント
- '最初の行を"と書く方がよいのではないでしょうか Linuxでコマンドを実行しますか?"
- user15760、いいえ、質問が好きなので検索エンジンで検出可能であり、この質問を持っているすべての人が生まれつきの' nixsters(:
回答
Linux、UNIX、および関連するオペレーティングシステムでは、.
は現在のディレクトリを示します。現在のディレクトリとそのディレクトリでファイルを実行するためです。 $PATH
にない場合は、シェルに場所を伝えるために./
ビットが必要です。実行可能ファイルはです。したがって、./foo
は、このディレクトリにあるfoo
という実行可能ファイルを実行することを意味します。
type
または which
$PATH
で見つかったコマンドのフルパスを取得します。
コメント
- 現在のディレクトリでプログラムを実行することは非常に一般的です。 'シェル検索も行われないのはなぜですか?最初に。を検索し、次に$ PATHを検索します。
- iv id = “b321ad2e9d”だけでなく、邪魔になる可能性のある
alias
もあります。 >
。
.
で検索した場合、セキュリティの問題になります。あなたまたは他の誰かが置き換える可能性がありますたとえば、ls
(単純なウイルス/ trojen:ls
という名前の実行可能ファイルを含むzipファイルを作成し、誰かが検索しているときに、彼らはこの実行可能ファイルを実行します、それは…)。最後に.
で検索した場合、プログラムが機能していない理由がわからないまま、長い時間を費やすことができます(たとえば、実行するプログラムを実行する代わりに、testというプログラムを作成します)。システムテストプログラム。出力は生成されません。回答
文字通りの答えは、他の人が与えたとおりです。現在のディレクトリが$PATH
にないためです。
しかしなぜですか?要するに、それはセキュリティのためです。 「他の人のホームディレクトリ(または/ tmp)を探していて、gcc
またはls
と入力した場合は、次のようにします。いたずら好きの友人が書いた、すべてのファイルを消去する悪意のあるバージョンではなく、実際のバージョンを実行していることを知ってください。別の例は、test
または[
。シェルにこれらのコマンドが組み込まれていない場合、シェルスクリプトのコマンドをオーバーライドする可能性があります。
.
をパスの最後のエントリは少し安全ですが、それを利用する他の攻撃があります。簡単な方法は、sl
やls-l
などの一般的なタイプミスを悪用することです。または、このシステムにインストールされていない一般的なコマンドを見つけます。たとえば、vim
は、システム管理者がそれを入力する可能性が平均を上回っているためです。
これは理論的すぎるように聞こえますか? 大部分ですが、特にマルチユーザーシステムでは、実際に発生する可能性があります。実際、これは、管理者がユーザーのホームディレクトリに切り替えてps
を見つけたこのサイトの例です。その名前の実行可能ファイルによってマスクされます。
コメント
-
PATH
環境変数。
回答
つまり、なぜ必要なのですか。/開始時-これは、(Windowsとは異なり)現在のディレクトリがデフォルトでパスの一部ではないためです。実行する場合:
$ ls
シェルは、PATH環境変数(iv)のディレクトリでls
を探します。 id = “b0ea2fff81″>
で確認)、見つかったls
という最初の実行可能ファイルを実行します。次のように入力した場合:
$ a.out
シェルも同様に機能しますが、おそらくa.outという実行可能ファイルは見つかりません。シェルに場所を指定する必要があります。 a.outは-現在のディレクトリ(。)にある場合、パスは./a.out
です。
「なぜ呼び出されるのか」を尋ねる場合「a.out」、これはgccのデフォルトの出力ファイル名です。-oコマンドライン引数を使用して変更できます。例:
$ gcc test.c -o test $ ./test
コメント
- ありがとうございます。なぜ最初に./が必要なのか疑問です… "."(現在のディレクトリをpoitするため)しかし、なぜ" / "その後?
- /はLinuxのパス区切り文字なので、ディレクトリ(。)をファイル名(a.out)から分離するために使用します。これがないと、有効な.a.outがあります。ファイル名自体が正しいです(これを確認するには、
touch .a.out; ls -lA
を試してください。) - これがUnixのパス
<dir>/<file>
なので、基本的には現在のディレクトリでファイルを実行すると言っています。これは./test
- Windows 10ではPowerShellがデフォルトのシェルになり、現在のパスで実行可能ファイルを実行するには
./
も必要です
<で示されます。 li> Red Hat Linux 9?アップグレードの時間です!
回答
$ PATH変数に:.
を追加してみてください。
ALT + F2を試して、Linux / GTKを実行している場合はgksudo gedit /etc/environment
と入力します(これはUbuntuを使用している場合です)。
ただし、そうしないことを強くお勧めします。それは「悪い悪い悪いそして悪い」です。
1970年以来、そのようなことはこのように機能します。現在のディレクトリが$ PATHに含まれていないのには理由があります。
.
は現在のディレクトリです
.something
は隠しファイルになります(「ALT +」と入力して作成します)それらはNautilusに表示されるか、「ls -la
」を試してください。
./someProgram.sh
は、実行可能ファイルsomeProgramを実行するために入力するものです。現在のディレクトリに.shがあります。
.somethingElse
は、現在のディレクトリに隠し実行可能ファイルがあることを意味します。これは悪い考えです。
回答
より完全なルールは、実際には次のとおりです。スラッシュがある場合/
がパスに含まれているため、PATH
を検索しないでください。理論的根拠として、最初にこの事実について知っておく必要があります。次のいずれかを実行します:
bin/someprog
または:
または:
cd bin ./myexec
ividを検索せずにbin/someprog
を実行しますまったく同じ理由で= “8b369a88a8″>
変数:bin/someprog
、/bin/someprog
、にはスラッシュ/
が含まれています。
someprog
だけではスラッシュはありません/
であるため、PATH
でのみ検索します。
POSIX 7 は、このルールを次の場所で指定します: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
PATH
[…]検索するパス名に
<slash>
が含まれている場合、パスプレフィックスの検索は実行されません。 。
/
POSIXPATHルールの根拠
実行中の場合:
someprog
検索します:
- CWDに対して最初に
- PATHに対して
次に、実行する場合は<ディストリビューションからのdivid = "8ee0d06b82">
で、次のことを行いました:
someprog
機能することもありますが、失敗することもあります。別の無関係なsomeprog
プログラムを含むディレクトリにいる可能性があります。
したがって、これは信頼できないことがすぐにわかり、常に使用することになります。 PATHを使用する場合は絶対パスを使用するため、PATHの目的が無効になります。
これが、PATHに相対パスを含めることが非常に悪い理由でもあります。私はあなたを見ています、node_modules/bin
。
逆に、次のように実行するとします。
./someprog
検索します:
- 最初にPATHに対して
- 後のCWDと比較して
次に、スクリプトsomeprog
をgitリポジトリからダウンロードして実行したい場合CWDからは、これが実際に実行されるプログラムであるかどうかはわかりません。これは、ディストリビューションに次のものがあるためです。
/bin/someprog
昨年のクリスマス以降に飲みすぎた後にインストールしたパッケージもあります。
したがって、繰り返しになりますが、実行しているものを知るために、フルパスを使用してCWDに関連するローカルスクリプトを常に実行する必要があります。
"$(pwd)/someprog"
これも非常に面倒です。
思いついたもう1つのルールは、次のとおりです。
相対パスはPATHのみを使用し、絶対パスはCWDのみを使用します
ただし、これもユーザーに常にabsoを使用する"$(pwd)/someprog"
を使用する非PATHスクリプトのリュートパス。
/
パス検索ルールは、覚えやすいソリューションを提供します。問題について:
- スラッシュ:
PATH
- スラッシュなし:
を使用しないでください
これにより、現在のディレクトリ内のファイルを
またはsomefile
であるため、そのうちの1つに特別な意味があります。
検索できないことが少し面倒な場合があります。 PATH
に関連するsome/prog
の場合ですが、これに対する適切な解決策が見つかりません。