'cd'と 'cd~'の違い

'cd'と 'cd~'の違い

知りたいです。CD自分だけのホームフォルダに送ってくださいCD〜同じですが、なぜ〜を最初に追加しますか?

これはBASHに固有のものですか、それとも他のシェルでは異なる動作ですか?

答え1

その~用途はここでは終わりません。すべてのコマンドは、ホームフォルダへのショートカットの利点を享受できます。だから家にCDを入れたいなら必ずしも必要ではないが、何~/.config

$ cd ~/.config

それ以外の場合は、デフォルトのパスを作成するか、varを使用するか、$HOME2つのcdsを実行する必要があります。ファイルのコピーまたは移動にも使用できます。

$ cp ~/downloads/some-file some/path/

ほとんどのファイルは家にあるので、常にショートカットを持っていることをお勧めします。

答え2

デフォルトでは引数なしcdcd呼び出し、cd「...dirが指定されていない場合、HOMEシェル変数の値はデフォルトです。」バッシュマニュアル)。対照的に、cd ~コマンドに引数を指定すると、シェルはcd次のように実行します。~チルダ拡張。ユーザーのホームディレクトリを返す場合は違いはありません。どちらの場合も、HOME環境変数が照会されます。

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

実際にはこれと同じですcd $HOME。ただし、cdチルダは1つのタスクのみを実行しますが、~+現在の作業ディレクトリなどの他の拡張機能を実行するために使用できます。

しかし興味深いのは、中断しても機能し続けることunset HOMEcdできる~ということです。

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

なぜ?また、マニュアルの答え:

HOME が設定されていない場合、シェルを実行しているユーザーのホームディレクトリが置き換えられます。それ以外の場合、チルダプレフィックスは指定されたログインに関連付けられているホームディレクトリに置き換えられます。

設定解除は、空の変数を設定するのと同じではなく、HOME=機能します。ドキュメントでは、変数の設定解除について具体的に説明します。空の文字列と同じ変数を作成することは、私たちが期待するものとは反対です。

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

HOMEここで空の文字列を生成すると、チルダと動作が中断されることがわかりますcd


チルダとチルダ$HOMEには、いくつかの異なる理由があります。$HOMEこれは環境変数の1つでもあるシェル変数であり、Cのすべてのプログラムからenviron()アクセスするために使用できます。対照的に、関数を使用してシェルなどの拡張を実行tildeできますが、チルダ拡張を実行するためのシェル固有の構文があります(wordexp()引用する)Cでも同様です。

~表示された理由HOMEはすでにこの問題: 昔は、チルダ文字がHOMELear-Siegler ADM-3A端末と同じキーを共有していました。HOME対照的に、環境変数は純粋に象徴的な意味を持ち、物理的な表現はありません。

さらに、HOME環境変数であるという事実は、~他のものを簡単に設定できないため、設定を解除することを可能にします。

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

変数が設定されていない空行もecho最初に出力されます。一方、チルダを使用するには、次の操作を実行できません。

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

ただし、変更はHOME次の点に影響します~

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

拡張文字としても使用できるため、~次のように現在の作業ディレクトリを表示できます。

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

ただし、環境変数を介してこれを行うには変更せずにPWD維持HOMEする必要があります。同様の操作を行う場合は、echo $HOME+文字列/変数の連結にすぎません。しかし、今回も~+環境変数から情報を取得します。

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

ノート~+~-拡張は有効ですkshが有効ではありませんdash


特定の質問に答えるには:

これはBASHに固有のものですか、それとも他のシェルでは異なる動作ですか?

いいえ、これは一貫した行動でなければなりません。kshdashおよび - 両方cshor と同じように動作します。cdcd ~

それでは、最初に〜を追加するのはなぜですか?

私が言うのは、チルダへのリンクされた答えに記載されているように、利便性と歴史的な理由です。最終的にこれは単純なホームディレクトリ拡張以上の役割を果たします。

答え3

いくつかのフォルダレベルの上または下に関係なく、$HOMEコマンドcdcd ~コマンドは同じことを行い、違いはありません。ホームディレクトリに戻ります。

ただし、HOMEより1つ以上のフォルダレベルにあり、1つ以上のフォルダレベルの下にあるサブディレクトリに直接移動する場合は$HOMEチルダ()は、コマンドを入力する~ときに引用する必要があるテキストを置き換えるために使用するときにキーストロークを保存するのに役立ち、便利です。$HOMEcd例えば。

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3

答え4

~は/home/usernameの場所を表しているため、入力中に時間を節約できます。たとえば、cd /home/username/Downloads は cd ~/Downloads と同じですが、入力回数が少なくなります。どちらのコマンドも同じことを行います。作業ディレクトリをその場所に変更します。

関連情報