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


13

これは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ます。

回答:


20

実行可能ファイル(またはunix / linuxの世界-実行可能権限/フラグがオンのファイル)を実行すると、次のようになります。

$ ./jdev

次に、.名前が付けられjdev、それを起動しているユーザーの実行権限を持つ作業ディレクトリ(現在のディレクトリ)内でファイルを実行することをマークします(まだリンクであることに注意する必要があります)他のファイルls -l jdevは、ターミナルに入力することで確認できます)

linux / unixのファイル許可を参照)

として実行するとき

$ jdev

そして、最も可能性がありjdev、システム上のインストールのどこかで、あなたはそれを持っている$PATH(例えば/usr/bin/または/bin/または/usr/local/bin/

peterph述べた:あなたが使用することができますwhichに例えば、特定のコマンドで起動されている実行可能ファイルを指すように:

$ which find
/usr/bin/find

1
またwhich、パスが指定されていない場合にユーティリティがどの実行可能ファイルを使用するかを通知できるわけではありません。
ペテルフ

@peterph私の答えを編集しました。
パトリク

7
type特定のコマンドによって起動されたものを確認するために使用することをお勧めします。原因whichは$ PATHのどこかにバイナリを表示しますが、絶対に別のバイナリにエイリアスされている可能性があります。
ラッシュ

@rush私はちょうどそれを試してみましたが、あなたが言うように動作しません:[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim。一方zsoelim -> soelim
パトリク

2
@Patryk rushは、which実行中のシェル環境(つまり、環境変数だけでなくエイリアスと関数を意味する)にアクセスできないスタンドアロンのバイナリであるため、シェルエイリアス/関数を意味していると思います。 、その一部は継承されます)。
ピーター

8

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

名前にスラッシュが含まれている場合、それは起こりません。名前はコマンドを実行するためのパスとして使用されます(ただしzsh、エイリアスや関数のような一部のシェルでは、名前にスラッシュを含めることができます)

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

シェルが実行する内容を知るには、type次のコマンドを使用します。一般に、あなたが思っていることをしないコマンド使用しないでください。whichコマンドはそのままにしておくcshほうが良い遺産です。


なぜ「どちら」ではなく「タイプ」ですか?
オタク


正しいリンクを提供しましたか?
オタク

それはこのサイトでの検索結果であり、よくある質問であることを証明しています。それらの質問への多くの答えは、なぜ使用しないかを教えてくれますwhich。たとえば、unix.stackexchange.com / questions / 16693
ステファンシャゼル

2

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

以下は、物事をよりよく理解するための例であり、どのように選択されるかです。

[ 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:~ %

1

これはおそらくシェルに依存しますが、通常のルールは次のとおりです。

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

  • パスではなく名前のみを指定する$PATHと、実行しようとしているツールのディレクトリが検索されます。

現在のディレクトリに、のディレクトリの一部にあるファイルと同じ名前のファイルがあり、その名前の$PATH先頭に追加./して実行すると、事実上別のファイルが実行されます。

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

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


あなたの用語はわかりにくいです。jdev単独でも相対パスです。ルールは次のとおりです。スラッシュが含まれていない場合は、エイリアス、関数、および$PATHで検索されます。そうでない場合は、ファイルシステムで直接検索されます(ただし、一部のシェルでは、優勢)。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.