「cd」と「cd〜」の違い


10

場合、私は、疑問に思ってCDだけでは私のホームフォルダに私を送信し、CDは〜、なぜ〜その後、最初の場所で同じ追加されましたでしょうか?

それはBASHに固有のものですか、それとも別のシェルでは異なる動作をしますか?


2
間違いなく重複ではありません。その質問はcd ~vs cd $HOMEvs について尋ねていcd ~not-tanduます。この質問はcdvs について尋ねていcd ~ます。

回答:


17

~ただ、それ以上に使用することができます。すべてのコマンドは、ホームフォルダーへのショートカットを持つことから利益を得ることができます。ですから、家にcdしたい場合は必要ありませんが、どう~/.configですか?

$ cd ~/.config

それ以外の場合は、ホームパスを書き出す$HOMEか、varを使用するか、2つcdのsを実行する必要があります。ファイルのコピーまたは移動についても:

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

ほとんどのファイルは家にあるので、ショートカットを用意しておくとよいでしょう。


こんにちはahilsend、実際私の質問はなぜ2つの方法にもっと向けられています。私はすでに$ HOME変数の使用について知っていますが、これを念頭に置いて、なぜ「CD」だけでも私を家に送りますか。なぜ同じ目的で2つの方法があるのですか?
Luis Alvarado 2013

4
@CYREX私の推測では、ホームディレクトリに移動したいという非常に一般的なケースでのタイピングを節約することでしょう。
CVn 2013

1
他の使用が~行うことですcd ~user/download、ユーザーのダウンロードディレクトリに移動します。
ott-- 2015年

5

行うことcd は基本的にcd引数なしで呼び出すことであり、cd動作に従って「... dirが指定されていない場合、HOMEシェル変数の値がデフォルトです。」(bashマニュアルから)。対照的に、コマンドにcd ~引数を指定cdすると~、シェルはチルダ展開を実行します。ユーザーのホームディレクトリに戻る限り、違いはありません。どちらの場合でも、HOME環境変数が照会されます。

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

事実上、これもとの違いはありませんcd $HOME。ただし、cdは唯一のことを行いますが、チルダは~+現在の作業ディレクトリなどの他の展開を実行するために使用できます。

しかし、興味深いことに、我々はできるunset HOME破ることcdが、~まだ動作します:

$ 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はチルダ展開を実行するシェル固有の構文ですが、Cでもwordexp()関数を使用してシェルのような展開(参照)を実行できます。

~表現する理由HOMEこの質問で答えられています:ティルデ文字がかつてHOMEリアシーグラー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、およびcsh-すべてと同じように動作cdcd ~

なぜ最初に〜が追加されたのですか?

チルダに関するリンクされた回答で説明されているように、私は便利さと歴史的な理由を言うでしょう。最終的には、ホームディレクトリの拡張だけでなく、それ以外のものも実行できるようになりました。


0

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

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

/$ 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

0

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


あんまり。たとえばroot、通常、ホームディレクトリは外部にあります/home
Dmitry Grigoryev '30
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.