`cd..`、`cd.`、`cd...`の違いは何ですか?彼らは何をすることができますか?

`cd..`、`cd.`、`cd...`の違いは何ですか?彼らは何をすることができますか?

私はシステムプログラミングを学ぶ初心者です。

cd ..cd .、、、およびの使い方を検索してみましたが、わかってcd ...みると、cd ..あるディレクトリの後ろに移動するという意味だけでした。

MacOSの端末で試してみました。タイピングがcd ..機能します。しかし、私がcd ...それを入力するとそれは言う

zsh: command not found: cd...

入力してもパスは変わりませんcd .

この質問に答えるのを手伝ってください。ありがとうございます。

答え1

ディレクトリ.は、..現在のディレクトリと親ディレクトリをそれぞれ参照する特別なディレクトリです。

このコマンドはcdディレクトリを変更します。したがって、cd .特別なものはありません(あなたがいる場所に行ってください)。

すべてのUNIXシェルでは、コマンドとその引数をスペースで区切る必要があるため、コマンドではcd...なくcd存在しません。一部のシステムには...2つのディレクトリにショートカットがありますが、これは標準ではなく、私が知っている現在のシステムでは機能しません。だからcd...与えられるかもしれcommand not foundないし、cd ...与えられるかもしれませんno such file or directory

このcdコマンドはシェルに組み込まれており、そのマニュアルはシェルのマニュアルページにあります。たとえば、man bashまたはman bash-builtins

.そして使用を含むパスチェックがどのように機能するかについては、..POSIX規格で確認できます/man path_resolutionhttps://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13

答え2

ファイルパスを引数として取るシステムコールでは、相対.パスはここ..親ディレクトリ。 ¹ と同じで、親some/dir/.ディレクトリであり、シンボリックリンクではない可能性があります。some/dirsome/dir/..some/dirsomesome/dir

伝統的には.、そのディレクトリがあるディレクトリ、親ディレクトリへのハード..リンクとして実装され、最初はユーティリティによって呼び出され、後でシステムによって呼び出されます。ファイルシステムによっては、まだそうであるかもしれません。この合計は/によって返されても返されない場合がありますが、それに関係なく常に解決する必要があります。...mkdirmkdir()...readdir()getdents()ここそして親ディレクトリファイルパスを引数として使用するシステムコールから。

したがって、これはファイルパスを引数として使用するほとんどのコマンドにも当てはまります。

  • vi some/dir/../file編集中のfile親ディレクトリのファイルですsome/dir(必ずしも同じである必要はありませんsome/file)。
  • lsls .現在の作業ディレクトリの内容をリストする略語です。現在の作業ディレクトリにあるファイルの詳細を一覧表示する略語ですls -ldls -ld .
  • ls -l ..現在の作業ディレクトリの親ディレクトリの内容を一覧表示します。

cd(そしてそれを持っているシェルで)ほとんどのシェルではそれ自体を実装するpushdので例外です。cd論理ディレクトリのナビゲーション

cd some/dir/..chdir("some/dir/..")chdir()現在の作業ディレクトリを変更するための実際のシステムコールはどこにありますか?)実行せずに一部のシェルchdir("some")で実行します(時々現在の作業ディレクトリへのパスが存在しなくなったchdir("$PWD/some")場合も同様です)。$PWDそしてそのようなことはcd ..しません。chdir("..")chdir(dirname($PWD))

つまり、ユーザーcdが驚くリスクを最小限に抑えるために、シンボリックリンクがディレクトリとして処理されるように、独自に処理されますcd..たとえば、シンボリックリンクだけでもcd some/dir; cd ../..開始した場所に戻ることができます。some/dirsome/somewhere/entirely/different

混乱を招く可能性があるため、これを覚えておくことが重要です。たとえば、vi some/dir/../fileさまざまなファイルを編集できます。cd some/dir/.. && vi file

他のコマンドのように処理するにはcdoption²が必要です。これがスクリプトでそれを使用することがしばしば推奨される理由です(したがって、この点でシェルで書かれたプログラムは、他の言語で書かれたプログラムと同じように機能します)。..-Pcd -P

今は...特別なファイルではないので、他のファイルと同じように扱われます。

mkdir ... && cd ......(で始まるので隠されています)という名前のディレクトリが.作成され、そのディレクトリに移動されますchdir()(シェルに従って)chdir("...")chdir("$PWD/...")

cd ......それ以外の場合は、存在しないエラーが返されますcd any/other/inexistent/directory

cd...cdとの間にスペースがない場合は、ご使​​用の環境に存在しない可能性があるコマンドを...呼び出そうとし、cd...それに応じてエラーを返します。

今、入力時間を短縮するために、一部の人々はcd...次のエイリアスを作成しました。

alias cd...='cd ../..'  cd....='cd ../../..'

したがって、呼び出しは現在の作業ディレクトリの親ディレクトリの親ディレクトリを呼び出しcd...ます(cd論理的になぜなら、上記のようにa)を実行するのではなく、尾から2つのディレクトリコンポーネントを取り出すからです$PWDchdir("../..")

zshまたありますグローバルエイリアスは、通常のエイリアスなどのコマンド位置だけでなく、どこでも拡張できるため、一部の人は次のようにします。

alias -g ...=../.. ....=../../..

これは、事前実行(pre-execution)または実行前(before-execution)を意味cd ...し、ls ... 変更されます。ただし、これは適用されません。持つcd ../..ls ../..cd .../dir.カスタムキーバインディングを使用して同様の機能を達成するためのより良い方法


1 ifsome/dirはシンボリックリンクですが、some/dir/.like はシンボリックリンクが指すディレクトリを参照します。この区別は、some/dir/シンボリックリンクが解決されたlstat()lchown()(例:.. .)。readlink()unlink()open()chown()

²ブロック/処理やブロック(またはzshでは...)特別な処理-Pはありませんが、これは別の質問です。$CDPATH$cdpath--1+2

関連情報