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


30

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

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

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

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

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

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

これと同様に:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

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

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

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


2
ちょっとした補足として、「ボランティア」と綴られており、「e」の代わりに「u」が付いています:)
AER

2
私はリベラルなスペラーです。
j0h

回答:


68

~ あなたのホームディレクトリです。

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


したがって、

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

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


に:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hディレクトリに展開されますj0hjay、再び、存在することはほとんどありませんのホームディレクトリ、。


違いが発生する場所ではなく~、と~/で発生~~fooます。


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

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

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

そして、あなたが使用している場合pushdpopd、ディレクトリスタックを維持するために、そしてだろうの出力に見られるように、ディレクトリスタックにおける番目のディレクトリ。末尾から数えてディレクトリになります(どちらの場合もゼロから数えます)。例えば:~N~+NNdirs~-NN

$ 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 
  ~+   ~-

だから、~+常にそれと同等.ですか?冗長のようです。
ワイルドカード

1
@Wildcardは、正確ではありません。~+そして~-、絶対パスである$PWDおよびの値を使用します$OLDPWD.常に相対パスです。そのため、実行時に現在の作業ディレクトリを変更するコマンドがある場合、の新しいパスが表示.され~-ますが、展開されたパスは同じままです。tar -Cは例ですが、私はの良い使い方を考えられないことを認めています~+。スペースが含まれ$PWDている~+/foo/bar場合$PWDは引用する必要がないことを除いて、同じように良いでしょう。
ムル

1
ありがとう、それはそれを明確にします。実際、それはすぐそこにあるユースケースの良い例です。一部のコマンドは、セキュリティ上の理由で相対パスでの操作を拒否します。このようなコマンドでは、使用できません./filenameが、"$PWD/filename"またはより簡単に使用できます~+/filename。(そして、いくつかのコマンドがします動作し、相対パス名ではなく、機能的な違いは、次のような、そこにあるlntar。)
ワイルドカード

21

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が代用しないからです。


何てgetent passwd bin言うの?
ムル

2
「bin」は、ほとんどのLinuxマシンのシステムユーザーであり、ホームディレクトリは/ binです。
fNek

1
展開の失敗~dirは、GNUドキュメントと一致しています: "...チルダに続くチルダプレフィックス内の文字は、可能なログイン名として扱われます ...ログイン名が無効な場合、またはチルダ展開が失敗した場合、単語そのままです。」ここでdirは、はこのシステムのユーザーの名前ではないため、変更されません。
apsillers

皆さんありがとう。私はおそらく私が投稿したリンクを読む必要あります:)
オリ

4

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

ご覧の/通り、いつものように、ファイルシステム階層の新しいレベルを示しています。


3
半分だけ右、$ HOME環境変数の省略形です。~{user}/passwd(5)データベースファイルで設定された任意のランダムパスになります。はい、filesytem.org標準は通常のユーザーを/ homeに配置しますが、これはすべてのユーザー(/ rootのルート、/ var / ...のサービス、または/ homeの代わりに/ usrを使用する古いUNIX)の場合ではありません
ドワイトスペンサー

DwightSpencerは正しいです。ユーザーが/ usr / {CLIENTNAME} / home /にあり、複数の社内およびリモートシステム(すべてそのディレクトリを指す)で共有されている複数のサーバーを維持するため、1つのシステムのみを維持する必要があります。そして〜はそのディレクトリを指します;)
Rinzwind

3
@Rinzwind eek。私はこの神聖な悪用に抗議しなければなりません/usr
ムル

@muruちょっとそれは私の呼び出しではありませんでした>:-DそれはSCO Dからの残りでした:
Rinzwind

1
正直なところ、ユーザーがすべてのものに/ usrを使用するのが好きでした。最近私が見つけたのは、ベースbinutils以外のすべてのバイナリ(sys、user、sysop)のグランドユニファイドダンプグラウンドとしての/ usr / binのより不正な誤用です。/ usr / localはsysopバイナリおよび/ binシステムバイナリとして/ sbinを持つローカルユーザースペースであるのに対し、すべての/ usrはユーザーがnfsマウントからプルするためにアクセスできるすべてのものであるためです。/ homeを別のパーティションにすることができますが、/ usr / home / ...を/ usrに保持すると、ポリシー、実装、および考え方の両方でユーザー名前空間として保持できます。
ドワイトスペンサー

3

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.