web-dev-qa-db-ja.com

チルダを使用すると、ホームディレクトリへのショートカットとしてどのように機能しますか?

あるPCから別のPCにいくつかのファイルをコピーしようとして混乱しました。私はそれを理解しましたが、構文はまだ混乱しています。これは動作します:

scp ~/Desktop/Volenteer.png [email protected]:~j0h/b

Volenteer.pngをフォルダー/home/j0h/bに配置します。ただし、これは機能しません。

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

これも失敗し、終了ステータス1ファイルが見つかりません。

scp ~/Desktop/Volenteer.png     [email protected]:~/j0h/b

これと同様に:

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

明らかに、~~/にはいくつかの違いがあります。その違いは/の存在です

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

なぜscpでは、~~/に解決されるのですか?それは推測です、私はそれが起こっていることを確認することはできません。しかし、それは一貫性がなく、したがって混乱を招くようです。これはscpのバグですか?それとも私が行方不明になっているチルダについて何かありますか?

29
j0h

~はホームディレクトリです。

~fooは、そのようなユーザーが存在する場合はユーザーfooのホームディレクトリ、そのユーザーが存在しない場合は~fooという名前のディレクトリのみです。


したがって、

scp ~Desktop/Volenteer.png     [email protected]:~j0h/b

~Desktopは、そのようなユーザーが存在する場合(通常は存在しない場合)、ユーザーDesktopのホームディレクトリに展開するか、単に~Desktop(通常も存在しないパス)になります。


に:

scp ~/Desktop/Volenteer.png     [email protected]:~/j0h/b

~/j0hは、jayのホームディレクトリ内のj0hという名前のディレクトリに展開されますが、これも存在する可能性は低いです。


違いが発生するのは~~/ではなく、~~fooです。


さらに、~はディレクトリ履歴のナビゲーションにも使用できます。

  • ~-は前の作業ディレクトリです($OLDPWDなど)
  • ~+は現在の作業ディレクトリです($PWDなど)

scp操作の途中でディレクトリを変更することはできないため、これはscpには適用されません。

また、 pushdおよびpopd を使用してディレクトリスタックを維持すると、~Nおよび~+NN番目のディレクトリになりますdirsの出力に見られるディレクトリスタック。 ~-Nは、末尾からN番目のディレクトリになります(どちらの場合もゼロからカウント)。例えば:

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

次に、スタック内のディレクトリに次を使用してアクセスできます。

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-
66
muru

Bash Tilde ExpansionのGNUドキュメント を読んでください(この答えの最初の反復の前に持っているべきです)。

~/Desktop~j0hは根本的に異なることを行っているため、~Desktopが機能しない理由を説明しています。

  • ログイン時に設定される現在の~環境変数の代わりに、プレーン$HOMEが使用されます。したがって、~/home/oliに解決され、~/Desktop/home/oli/Desktopとして読み取られます。これは、最も使用されているチルダを見る場所です。

  • ~usernameは、そのユーザーのホームに解決されます/etc/passwdで設定されています。したがって、~oli/home/oliに解決され、~j0h/home/j0hに解決される可能性がありますが、必ずしもそうではありませんが、homedirはどこでもかまいません。

  • ~not-a-usernameは解決しません。 Desktopはユーザーではないため、~Desktopは置き換えられません。文字通り、~Desktop(ここには存在しません)という名前のファイルまたはパスとして扱われます。

そして言うまでもなく、これはすべてリモートで行われます(ローカル値で置き換えられた場合、scpでは役に立たないでしょう)。これが機能するのは、Bashの前に空白以外のものがある場合、~...を置換しないためです。

21
Oli

シンボル~bash/home/userのショートカットとして使用されるため、~/Desktop/Volenteer.pngの場合は/home/user/Desktop/Volenteer.pngの省略形です。

したがって、/を見るとわかるように、いつものように、ファイルシステム階層の新しいレベルを示しています。

4
Mark Kirby

~は、環境変数$HOMEの省略形です。ほとんどのcシェル派生/サポートPOSIX準拠シェルで。 ~の最も一般的な使用法は、自分のホームディレクトリまたは別のユーザーのホームディレクトリを参照する場合です。

cd ~ # ie Shell, take me to my home folder

cd ~root # i.e. Shell, take me to root's home folder

passwd(5) データベースを使用しているPOSIXシステム(UNIX、Linux、OS X、BSD)上のローカルユーザーのホームディレクトリを見つけるには、/etc/passwdでawkを実行します。

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

これにより、各ローカルユーザーとそのホームディレクトリが一覧表示されます。

3
Dwight Spencer