回答:
~
ただ、それ以上に使用することができます。すべてのコマンドは、ホームフォルダーへのショートカットを持つことから利益を得ることができます。ですから、家にcdしたい場合は必要ありませんが、どう~/.config
ですか?
$ cd ~/.config
それ以外の場合は、ホームパスを書き出す$HOME
か、varを使用するか、2つcd
のsを実行する必要があります。ファイルのコピーまたは移動についても:
$ cp ~/downloads/some-file some/path/
ほとんどのファイルは家にあるので、ショートカットを用意しておくとよいでしょう。
~
行うことですcd ~user/download
、ユーザーのダウンロードディレクトリに移動します。
行うこと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に固有のものですか、それとも別のシェルでは異なる動作をしますか?
いいえ、これは一貫した動作です。ksh
、dash
、およびcsh
-すべてと同じように動作cd
かcd ~
。
なぜ最初に〜が追加されたのですか?
チルダに関するリンクされた回答で説明されているように、私は便利さと歴史的な理由を言うでしょう。最終的には、ホームディレクトリの拡張だけでなく、それ以外のものも実行できるようになりました。
上のフォルダレベルでも下のフォルダレベル$HOME
でも、コマンドcd
とcd ~
は同じことを行い、違いはありません。ホームディレクトリに戻ります。
ただし、ホームの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
〜は/ home / usernameの場所を表すので、入力するときに時間を節約できます。たとえば、cd / home / username / Downloadsはcd〜/ Downloadsと同じですが、入力は少なくなります。どちらのコマンドも同じことを行い、作業ディレクトリをその場所に変更します。
root
、通常、ホームディレクトリは外部にあります/home
cd ~
vscd $HOME
vs について尋ねていcd ~not-tandu
ます。この質問はcd
vs について尋ねていcd ~
ます。