以下はコマンドの出力です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/
〜のようにペテブステートメント:which
toを使用して、特定のコマンドで実行される実行可能ファイルを指すことができます。たとえば、次のようになります。
$ 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つの問題は、実際に現在のディレクトリから実行可能ファイルを実行することです。$PATH
include に変更しない限り.
、これはまったく期待できないのです。
...そしてそれをそこに含めることはまだ良い考えではありません。.
そうする場合は、少なくとも$PATH
残りが常に最初に検索されるように最後に置きます。共有ネットワークディレクトリにあり、誰かがそこに1つを入れることにしたと想像してください。バイナリで始まる場合は、単純なバイナリだけでシステムを攻撃するのに十分ですls
。$PATH
.
ls -lah