ある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のバグですか?それとも私が行方不明になっているチルダについて何かありますか?
~
はホームディレクトリです。
~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
および~+N
はN
番目のディレクトリになります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
~+ ~-
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の前に空白以外のものがある場合、~...
を置換しないためです。
シンボル~
はbash
の/home/user
のショートカットとして使用されるため、~/Desktop/Volenteer.png
の場合は/home/user/Desktop/Volenteer.png
の省略形です。
したがって、/
を見るとわかるように、いつものように、ファイルシステム階層の新しいレベルを示しています。
~
は、環境変数$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
これにより、各ローカルユーザーとそのホームディレクトリが一覧表示されます。