Linuxでファイルを実行するために./filenameを使用するのはなぜですか?

なぜですか?他のコマンドのように入力するだけですgcclsなど…

コメント

  • '最初の行を"と書く方がよいのではないでしょうか Linuxでコマンドを実行しますか?"
  • user15760、いいえ、質問が好きなので検索エンジンで検出可能であり、この質問を持っているすべての人が生まれつきの' nixsters(:

回答

Linux、UNIX、および関連するオペレーティングシステムでは、.は現在のディレクトリを示します。現在のディレクトリとそのディレクトリでファイルを実行するためです。 $PATHにない場合は、シェルに場所を伝えるために./ビットが必要です。実行可能ファイルはです。したがって、./fooは、このディレクトリにあるfooという実行可能ファイルを実行することを意味します。

type または which $PATHで見つかったコマンドのフルパスを取得します。

コメント

  • 現在のディレクトリでプログラムを実行することは非常に一般的です。 'シェル検索も行われないのはなぜですか?最初に。を検索し、次に$ PATHを検索します。
  • iv id = “b321ad2e9d”だけでなく、邪魔になる可能性のあるaliasもあります。 >

  • @Michaelのセキュリティと健全性:最初に.で検索した場合、セキュリティの問題になります。あなたまたは他の誰かが置き換える可能性がありますたとえば、ls(単純なウイルス/ trojen:lsという名前の実行可能ファイルを含むzipファイルを作成し、誰かが検索しているときに、彼らはこの実行可能ファイルを実行します、それは…)。最後に.で検索した場合、プログラムが機能していない理由がわからないまま、長い時間を費やすことができます(たとえば、実行するプログラムを実行する代わりに、testというプログラムを作成します)。システムテストプログラム。出力は生成されません。
  • @jcubic that '悪い考えです。上記のコメントを参照してください。過去には、DOSは現在のディレクトリを検索し、その動作はWindows cmdに引き継がれ、多くのセキュリティ問題が発生していました。 MSはPowerShellでこれを修正し、現在のディレクトリでプログラムを実行するには。\を使用する必要があります
  • @ ctrl-alt-delor:80年後半に大学にいたとき'、これは一般的な(禁止された)戦術でした。 " ls "プログラムを作成し、他の誰かが詮索した場合に備えてホームフォルダに残します。このプログラムは、" get shell " IIRCと呼ばれていました。コマンドを実行しているユーザーの資格情報を取得しようとします。次に、偽のディレクトリリストを出力して、ユーザーに気付かないようにします。
  • 回答

    文字通りの答えは、他の人が与えたとおりです。現在のディレクトリが$PATHにないためです。

    しかしなぜですか?要するに、それはセキュリティのためです。 「他の人のホームディレクトリ(または/ tmp)を探していて、gccまたはlsと入力した場合は、次のようにします。いたずら好きの友人が書いた、すべてのファイルを消去する悪意のあるバージョンではなく、実際のバージョンを実行していることを知ってください。別の例は、testまたは[。シェルにこれらのコマンドが組み込まれていない場合、シェルスクリプトのコマンドをオーバーライドする可能性があります。

    .パスの最後のエントリは少し安全ですが、それを利用する他の攻撃があります。簡単な方法は、slls-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
    • <で示されます。 li> Red Hat Linux 9?アップグレードの時間です!

    • Windows 10ではPowerShellがデフォルトのシェルになり、現在のパスで実行可能ファイルを実行するには./も必要です

    回答

    $ 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の場合ですが、これに対する適切な解決策が見つかりません。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です