名前だけで実行可能ファイルを実行することと、前にドット/スラッシュを使用して実行することの違いは何ですか?

名前だけで実行可能ファイルを実行することと、前にドット/スラッシュを使用して実行することの違いは何ですか?

以下はコマンドの出力ですls -all

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe

今実行すると、jdev別のバージョンが実行されます。Oracle JDveloper実行したときよりも./jdev…なぜこれが起こるのでしょうか?

答え1

実行可能ファイル(またはunix / linuxの世界では実行権限/フラグを持つファイル)を次のように実行するとき:

$ ./jdev

.次に、名前が付けられ、ファイルを起動したユーザーの実行権限を持つ作業ディレクトリ(現在のディレクトリ)内でファイルを実行するようにマークしますjdev(まだ他のファイルへのリンクである可能性があることに注意してください)。ls -l jdev端末に入力して確認可能)

(バラよりLinux/unix でのファイル権限)

実行すると

$ jdev

そうであれば、jdevシステムのどこかにインストールされている可能性が高く$PATH(例えばまたはまたは/usr/bin/)にインストールしました。/bin//usr/local/bin/

〜のようにペテブステートメント:whichtoを使用して、特定のコマンドで実行される実行可能ファイルを指すことができます。たとえば、次のようになります。

$ which find
/usr/bin/find

答え2

名前にスラッシュなしでコマンドをシェルから呼び出すと、環境変数に指定されているシェルエイリアス、関数、およびパスのリストからコマンドが検索されます$PATH。 (現在の作業ディレクトリ(.または空の文字列で指定)または相対ディレクトリを含めることができますが、$PATHセキュリティ上の理由からはお勧めできません。)

名前にスラッシュがある場合、これは発生せず、名前はコマンドを実行するためのパスとして扱われます(一部のシェルでは、エイリアスまたは関数の名前zshにスラッシュを優先させることができますが)。

したがって、現在の作業ディレクトリでthatというコマンドを実行するには、スラッシュを含むfoo名前を指定する必要があります。./foo最も明らかです。フルパスを使用することもできます。または../dir/foo...

シェルが実行される内容を見つけるには、typeコマンドを使用します。whichこのコマンドを使用しないでください通常、それはあなたが思うように行われず、そのままにしておくのがcsh最善の遺産です。

答え3

$PATHのエイリアス、シェル組み込み、または他のエントリがどのようにどのような順序で見つかるかを確認するには、Zshに組み込まれている「where」(「which」よりも良い)を使用することをお勧めします;-)

以下は、物事と選択方法をよりよく理解するための例です。

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

答え4

これはシェルによって異なりますが、通常、ルールは次のとおりです。

  • 相対パスまたは絶対パスを指定すると、そのパスが使用されます。は現在のディレクトリを表す./jdev相対パスです.(実際にはls -all .同じを提供しますls -all)。これは/usr/bin/tool/絶対パスを使用します。この場合、指定されたファイルが実行されます。

  • パスは指定せずに名前のみを提供する場合は、ディレクトリで$PATH実行したいツールを検索します。

現在のディレクトリにいくつかのディレクトリのファイルと同じ名前のファイルがあり、$PATH名前の前にプレフィックスを付けて実行すると、./他のファイルが効果的に実行されます。

jdevおそらくもう1つの問題は、実際に現在のディレクトリから実行可能ファイルを実行することです。$PATHinclude に変更しない限り.、これはまったく期待できないのです。

...そしてそれをそこに含めることはまだ良い考えではありません。.そうする場合は、少なくとも$PATH残りが常に最初に検索されるように最後に置きます。共有ネットワークディレクトリにあり、誰かがそこに1つを入れることにしたと想像してください。バイナリで始まる場合は、単純なバイナリだけでシステムを攻撃するのに十分ですls$PATH.ls -lah

関連情報