私はシステムプログラミングを学ぶ初心者です。
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_resolution
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13
答え2
ファイルパスを引数として取るシステムコールでは、相対.
パスはここと..
親ディレクトリ。 ¹ と同じで、親some/dir/.
ディレクトリであり、シンボリックリンクではない可能性があります。some/dir
some/dir/..
some/dir
some
some/dir
伝統的には.
、そのディレクトリがあるディレクトリ、親ディレクトリへのハード..
リンクとして実装され、最初はユーティリティによって呼び出され、後でシステムによって呼び出されます。ファイルシステムによっては、まだそうであるかもしれません。この合計は/によって返されても返されない場合がありますが、それに関係なく常に解決する必要があります。.
..
mkdir
mkdir()
.
..
readdir()
getdents()
ここそして親ディレクトリファイルパスを引数として使用するシステムコールから。
したがって、これはファイルパスを引数として使用するほとんどのコマンドにも当てはまります。
vi some/dir/../file
編集中のfile
親ディレクトリのファイルですsome/dir
(必ずしも同じである必要はありませんsome/file
)。ls
ls .
現在の作業ディレクトリの内容をリストする略語です。現在の作業ディレクトリにあるファイルの詳細を一覧表示する略語ですls -ld
。ls -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/dir
some
/somewhere/entirely/different
混乱を招く可能性があるため、これを覚えておくことが重要です。たとえば、vi some/dir/../file
さまざまなファイルを編集できます。cd some/dir/.. && vi file
他のコマンドのように処理するにはcd
option²が必要です。これがスクリプトでそれを使用することがしばしば推奨される理由です(したがって、この点でシェルで書かれたプログラムは、他の言語で書かれたプログラムと同じように機能します)。..
-P
cd -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つのディレクトリコンポーネントを取り出すからです$PWD
。chdir("../..")
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