pwdに「〜kernel-ppa」という名前のフォルダーがすでにあるのに、cd〜k(&タブ)がcd〜kernoopsに展開するのはなぜですか?


8

~kernel-ppa内部にという名前のフォルダがあります~/Downloads

aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa

入力cd ~kTabて自動拡張を押すと、同じ開始文字のフォルダーが既に存在しているcd ~kernoops/にもcd ~kernel-ppa/かかわらず、シェルはに拡張します。

自動拡張を機能させるには、でエスケープする必要があり\ます。したがって、使用cd \~kしてTab正しく押すと、に展開されcd \~kernel-ppa/ます。使用cd \して押すことでもTabうまくいきます。

なぜそうなのか、なぜ脱出する必要があるのですか?さらに、~自動拡張にさえ必要ないので、何をエスケープしていますか?

フローを実行してcd ~kernoops/を押しEnter、を押すと、ターミナルのステータスが次のように変わります//

aditya@aditya-desktop:~/Downloads$ cd ~kernoops/
aditya@aditya-desktop://$ pwd
//
aditya@aditya-desktop://$ ls
bin   cdrom  etc   initrd.img  lost+found  mnt  proc  run   srv  tmp  var
boot  dev    home  lib         media       opt  root  sbin  sys  usr  vmlinuz
aditya@aditya-desktop://$ 

これは/ディレクトリのように見えますが、pwdそうです//正確には何ですか?


@RaduRădeanuどちらでもない、「/ home / aditya / Downloads /〜kernel-ppa」
エリオットフリッシュ14

まず、「cd〜kernoops /」を実行すると、存在しない「cd / home / kernoops /」に移動します。代わりに、 "cd //"を取得する別の方法である "cd //"を取得します。これは、奇妙に見えるルートファイルシステムのルートディレクトリです。
エリオットフリッシュ

単一のエスケープ「\\」が機能する理由については、with treeまたはwith lsを使用してフォルダーを確認すると、たまたま最初のサブフォルダーであることがわかります。
エリオットフリッシュ2014

@ElliottFrisch:それ~kernel-ppaがその中の唯一のフォルダーなので、実行cd してタブを押すと、に展開されcd \~kernel-ppa/ます。私も脱出する必要はありません!
Aditya 14

はい。また、Tabキーを押し続けると、他の使用可能な補完機能が順に表示されます。
エリオットフリッシュ2014

回答:


10

ご存知の~ように、ホームディレクトリに展開されます。しかし、見落としているように見えるのは、~john「john」という名前のユーザーのホームディレクトリに展開されることです。

/etc/passwdファイルを確認してください:

% grep ker /etc/passwd
kernoops:x:107:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

「システムユーザー」という名前が付けられていますkernoops(内部バグ報告のため)。だから、あなたが入力したときにcd ~kTabシェルをローカルディレクトリに展開する前に、ユーザー名の展開に優先(1)を与える、あなたが持っていますcd ~kernoops。これで、ユーザー "kernoops"のホームディレクトリは/になるので、そのようcdになります。

私のシェルではzsh、二重スラッシュ(2)はありません:

[:/] % cd ~kernoops/ 
[:/] % pwd
/
[:/] % cd //
[:/] % pwd
/

余談ですが、このディレクトリ名はよく考えられていません。スクリプトなどでトリプルケアが必要になります。私が考えることができる唯一の最悪のアイデアはそれにタブを埋め込むことです...


脚注:

(1)ではzsh、で~xdir始まるディレクトリがあり、で始まるユーザーがいない場合でもx、行うcd ~xTabことは展開されず、~与えられたエラーを引用しません:

[:~/tmp/x] %  mkdir \~xdir
[:~/tmp/x] % ls
~xdir
[:~/tmp/x] % cd ~xdir  
zsh: no such user or named directory: xdir
[:~/tmp/x] 1 % 

(2)posixが//パスのイニシャルを例外としたことを覚えているようです---一部の古いunixバリアント(私はそれを持っているDomain / OSでapollosを使用していました)が//machine-name/...他のマシンにシームレスにアクセスしていたため、維持する必要がありますローカルネットワークのファイルシステム(セキュリティはまだ発明されていません)。したがって、おそらくbashがここにあります。あなたが行う場合cd ///、あなたは、通常のを持っています/が、両方のシェルで。

はい、unix.seにあります!


1
もう1つの有名なレガシーOSは、そのようなダブルスラッシュ表記を使用しますが、そのスラッシュは通常、逆方向に書き込まれ、そのようなネットワークリモートファイルシステムにアクセスするためにスラッシュを受け入れるかどうかはわかりません。;-)
R .. GitHub ICE HELPING ICEを停止する

7

チルダ文字(~)は、シェルでは特別な意味を持っています。任意のコマンドで表示される場合は、ホームディレクトリの名前に展開されます。やることは同じですが、最終cd ~的にcd /home/adityaはホームディレクトリに置かれます。

\チルダの前にバックスラッシュ文字()を置くことにより、次の特殊文字の展開を行わないようにシェルに指示します(これはシェルエスケープと呼ばれます)。これによりcd \~、あなたはというディレクトリに移動するには、シェルをお願いし~、コマンドを実行しているディレクトリの下に配置されることになります。そのため、通常の動作であるとcd \~kernel-ppa呼ばれるディレクトリに移動し~kernel-ppaます。

編集:詳細〜

の後にシステムのユーザー名を書き込むと、~そのユーザーのホームディレクトリに移動します。こうTabした後に拡張することはcd ~、システム上の既存のユーザ名に展開されます。Tabcd ~kに完了した場合、システムユーザーにkernoopsという名前のユーザーがあり、ホームディレクトリがであるため、〜kernoopsに展開されます/cd ~k結果がcd ~kernoops/末尾にスラッシュを付けて展開され、ホームディレクトリがbeeing /になると、に移動し//ます。しかし、これは/すでに他の人が以前に言ったのとまったく同じです。


答えてくれてありがとう。あなたと@Rmanoの回答を組み合わせると、混乱が完全に解消されます:)
Aditya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.