知りたいです。CD自分だけのホームフォルダに送ってくださいCD〜同じですが、なぜ〜を最初に追加しますか?
これはBASHに固有のものですか、それとも他のシェルでは異なる動作ですか?
答え1
その~
用途はここでは終わりません。すべてのコマンドは、ホームフォルダへのショートカットの利点を享受できます。だから家にCDを入れたいなら必ずしも必要ではないが、何~/.config
?
$ cd ~/.config
それ以外の場合は、デフォルトのパスを作成するか、varを使用するか、$HOME
2つのcd
sを実行する必要があります。ファイルのコピーまたは移動にも使用できます。
$ cp ~/downloads/some-file some/path/
ほとんどのファイルは家にあるので、常にショートカットを持っていることをお勧めします。
答え2
デフォルトでは引数なしcd
でcd
呼び出し、cd
「...dirが指定されていない場合、HOMEシェル変数の値はデフォルトです。」バッシュマニュアル)。対照的に、cd ~
コマンドに引数を指定すると、シェルはcd
次のように実行します。~
チルダ拡張。ユーザーのホームディレクトリを返す場合は違いはありません。どちらの場合も、HOME
環境変数が照会されます。
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
実際にはこれと同じですcd $HOME
。ただし、cd
チルダは1つのタスクのみを実行しますが、~+
現在の作業ディレクトリなどの他の拡張機能を実行するために使用できます。
しかし興味深いのは、中断しても機能し続けること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
できますが、チルダ拡張を実行するためのシェル固有の構文があります(wordexp()
引用する)Cでも同様です。
~
表示された理由HOME
はすでにこの問題: 昔は、チルダ文字がHOME
Lear-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に固有のものですか、それとも他のシェルでは異なる動作ですか?
いいえ、これは一貫した行動でなければなりません。ksh
、dash
および - 両方csh
or と同じように動作します。cd
cd ~
それでは、最初に〜を追加するのはなぜですか?
私が言うのは、チルダへのリンクされた答えに記載されているように、利便性と歴史的な理由です。最終的にこれは単純なホームディレクトリ拡張以上の役割を果たします。
答え3
いくつかのフォルダレベルの上または下に関係なく、$HOME
コマンドcd
とcd ~
コマンドは同じことを行い、違いはありません。ホームディレクトリに戻ります。
ただし、HOMEより1つ以上のフォルダレベルにあり、1つ以上のフォルダレベルの下にあるサブディレクトリに直接移動する場合は$HOME
、チルダ()は、コマンドを入力する~
ときに引用する必要があるテキストを置き換えるために使用するときにキーストロークを保存するのに役立ち、便利です。$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
答え4
~は/home/usernameの場所を表しているため、入力中に時間を節約できます。たとえば、cd /home/username/Downloads は cd ~/Downloads と同じですが、入力回数が少なくなります。どちらのコマンドも同じことを行います。作業ディレクトリをその場所に変更します。