次の間に微妙な違いはありますか?
file
そして
./file
相対パスで?
答え1
シェルまたはexec*p()
libc関数でコマンド名として使用されている場合は、現在のfile
ディレクトリを検索しfile
($PATH
またはシェルの場合は組み込みバージョンを呼び出すか、その名前で関数を呼び出すことができます)、./file
現在のディレクトリを探します。ディレクトリが実行されます。
これは特別な動作を引き起こさず、./
コマンド名/
に$PATH
。を含むように与えられる./cmd
。cmd
/
この./
プレフィックスは、ファイル名が特定のコマンドで問題となる文字で始まらないようにするためによく使用されます。
たとえば、
rm ./-f
削除-f
, while がオプションで呼び出されrm -f
ます (また使用可能)。または:rm
-f
rm -- -f
cat ./-
awk '{print $1}' ./a==b.txt
そこには役に立ちません--
。
拡張によって問題のある文字が生成されるかどうか不明なスクリプトrm ./*
またはスクリプトを見つけます。awk ... ./*
*
答え2
はい。一部。
Cライブラリ関数
他の回答で述べたように、exec*p()
ライブラリ関数ファミリは、名前にスラッシュ文字が含まれているかどうかを使用してパス検索を実行する必要があるかどうかをテストします。
追加読書
その他の検索パスに関するコンテンツ
もちろん、プログラムはCライブラリの外部で独自のパス検索を実行できます。彼らはそれを実行する代わりに他のものを探しているかもしれません。あるいは、Cライブラリ関数とはわずかに異なる動作をしたい場合があります。これは、POSIX規格が要求するものが何であるかを知らない人にはほとんど知られていない驚きを与えます。だから彼らは独自の検索コードを実装しました。通常、Cライブラリの規則に従い、名前にスラッシュ文字が含まれている場合は、その名前をそのまま使用します。
たとえば、
そのような検索を実行し、これらの動作を実行するメカニズムをCDPATH
備えたシェルです。cdpath
TENEX Cシェルは次のとおりです。
~>cdpath=(/usr/) 設定 ~> cd ./etc. ./etc: そのファイルやディレクトリはありません。 ~>CDなど /など /etc>
マイナス記号で始まるファイル名
マイナス記号で始まるファイル名がコマンドラインオプションとして扱われないようにする1つの方法は、前に付けることです./
。
rm ./-rf
ファイル名で、rm -rf
コマンドラインオプションです。find ./-name wibble
2つのディレクトリツリーが検索され、すべてが見つかりますが、1つfind -name wibble
のディレクトリツリーが検索され、パターンマッチングが適用されます。
追加読書
コマンド構文はこれを重要にします。
時には、コマンドの構文がピリオドで始まる場合はファイル名になるように定義されます。そうでなければそれは別のものです。ある意味では、これはオプション文字としてのマイナス記号の規則を一般化したものです。
たとえば、
ダンバーンスタインとmultilog
daemontoolsでは、Bruce Guentermultilog
daemontools-encore, djbwaresからmultilog
そしてローラン・ベルコート(Laurent Belcote)s6-log
s6以降、コマンドラインパラメータは次のようになります。録音スクリプト各パラメータの最初の文字は、対応するスクリプトコマンドの種類を表します。ログディレクトリを表すには、スラッシュまたはピリオド文字で始まるコマンド文字列引数を指定する必要があります。 multilog ./t ./u
両方のディレクトリへのロギングを意味し、multilog t ./u
一方のディレクトリにロギングしてタイムスタンプを追加することを意味します。
答え3
file
PATH
あなたのファイルからこのファイルが検索されます。
./file
無視PATH
して現在のディレクトリから検索します。