「ファイル」パスと「./ファイル」パスに違いはありますか?


回答:


14

SmallLoanOf1Mの説明に夢中ではありません。技術的には正しいですが、質問の使用例と一致しない方法で回答します。

したがって、例として、質問からの2つの重要な違いの1つを次に示します。

ファイルの名前がシェルによって解析される文字で指定されている場合はどうなりますか?特に、実行中のコマンドによって解釈される文字に関して。

具体的には、「ダッシュ」文字:「-」。しかし、他の文字はシェルにとって意味があります。

例。ファイルの名前は「-dingle」です

ファイルをリストしてみてください:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

さらに悪いことに、ファイルの名前が「-rf rmbomb *」の場合はどうなりますか?今それを削除してみてください

rm "-rf rmbomb *"

私もその例を実行しようとはしていませんが、うまくいけばあなたはアイデアを得るでしょう。

それでは、どのようにしてダッシュで始まるファイルをリストしますか?./前で使用します。

# ls ./-dingle
./-dingle

同上 rm


それは奇妙な名前のいくつかのファイルを処理する有効な方法であり、私の答えはそのようなファイルを考慮しませんでした。上記のすべての例で、代わりに、上記で指定したスペースを含む奇数文字の前にバックスラッシュの形でリテラルを使用することもできます。その例は次のとおりです:ls \-dingleまたはls \-rf\ rmbomb\ \*。これは./、名前の前に指定すると./。の後の文字がエスケープされないため、指定されたコマンドセットの少なくとも一貫性を確保するための良い方法です。
スプーラー

2
エスケープはコマンドではなくシェルによってエスケープされ、paramsはコマンドによって解析されるため、エスケープまたは引用符で囲む-は何の役にも立ちません。
デウィモーガン

2
印刷をエラーにrm "-rf rmbomb *"する代わりに、実際に何か悪いことをするように聞こえrmます。ファイル名の引用を忘れた場合にのみ危険であるため、単語分割が発生します。(特に、rm $file代わりに実行するシェルスクリプトrm "$file"内。ただし、その場合、*glob展開は変数展開の内容に対して行われないため、展開されません。それが必要な場合は、eval。が必要です。)とにかく、スクリプトがrmに渡す前にファイル名を単語分割する場合は、というファイルを作成するspace -rf .ので、rm ./$i助けにはなりません。
ピーターコーデス

1
ちなみに、実際のエラーメッセージはrm: invalid option -- ' '-rf同じ引数の一部であるため、その後のスペースを1文字のスイッチとして解釈しようとしたときからです。(そして、はい、私は何かを見落としていただけの場合には空のディレクトリ内にこれを実行し、それが実際に危険だった:P)
ピーター・コルド

2
@PeterCordes:DOESをwordsplittingとグロブによって抑制されない限り、引用符で囲まれていない変数展開とコマンド置換の結果で発生IFS=''し、-f夫々 。まれな例は、実行する割り当てとして、ただし読み取るファイルとしてawkフォームfoo=barを持つオペランド(スクリプトである最初のオペランド以外)を処理./foo=barすることです。
dave_thompson_085

7

はい。

fileコマンドラインで発行することにより、BASHは$ PATH環境変数でその名前のファイルを検索します。ファイルが$ PATH変数内のディレクトリにない限り、見つかりません。

.現在のディレクトリを意味します。相対的な用語、現在のディレクトリ内を./意味します。これは、ディレクトリで作業中/home/sheogorath/shivering/isles.imgに呼び出すときのようなこと./isles.imgを言うことに相当し/home/sheogorath/shivering/ます。

そのため、通常、作業ディレクトリ内のファイルを「インプレース」で実行するために使用されます。

編集: あなたの例でlsは、シェルによって呼び出され、パス変数を使用して検出されています。その引数は、作業ディレクトリで処理されますが、それがどのようなものであってもかまいません。これはのデフォルトなので、両方とも現在のディレクトリを指すため、ls指定fileと明示的な指定の間に違いはありません./file

すべてのコマンドが作業ディレクトリ内のファイルパスを受け入れるわけではなく、一部のコマンドは、設定によって事前に定義されているディレクトリ内のファイルを指定することを期待します。引数としてファイルを受け入れるコマンドの中で、これらのコマンドはあまり一般的ではありません


1
それはbashですが、一般的にパスの解決について疑問に思っていました
セルゲイ・アラエフ

1
これは私がこれまでに聞いた作品のシェルです。BASHは最も一般的に使用されているだけです。
スプーラー

4
$ PATHはコマンドにのみ関連lsし、元の質問で言及されたようなコマンドに続くファイル名引数とは何の関係もありません。すなわち、refferencing間よりの差である相対パス(現在の作業ディレクトリに対して)すなわち../../dir/filenameし、絶対パス /path/to/dir/filename
HBruijn

1
Sheogorathの+1 ...と正解。
コーリー

1
デフォルトで作業ディレクトリ内のファイルを検索しようとするコマンドの引数である場合、それらは同じになります。したがって、lsそれらは常に同じパスになり、一方が他方より明示的に指定されます。引数を処理するときにすべてのコマンドがこのように動作するわけではありませんが、ほとんどのコマンドはこのように動作します。
スプーラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.