当我在pwd中已经有一个名为“〜kernel-ppa”的文件夹时,为什么cd〜k(&选项卡)扩展为cd〜kernoops?


8

我有一个名为~kernel-ppainside 的文件夹~/Downloads

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

现在,当我键入cd ~k并按Tab以进行自动扩展时,尽管已存在具有相同起始字符的文件夹cd ~kernoops/cd ~kernel-ppa/但外壳程序会将其扩展为。

为了使自动扩展正常工作,我需要使用对其进行转义\。因此,使用cd \~kTab正确按可以将其扩展为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”
Elliott Frisch

首先,“ cd〜kernoops /”将您带到不存在的“ cd / home / kernoops /”。取而代之的是,您得到“ cd //”,这是写“ cd /”的另一种方式-它是根文件系统的根目录,看上去确实很奇怪。
Elliott Frisch 2014年

至于为什么使用单个转义符“ \\”的原因,请查看带有tree或带的文件夹,ls您会发现这恰好是第一个子文件夹。
Elliott Frisch 2014年

@ElliottFrisch:我刚刚注意到,因为它~kernel-ppa是其中唯一的文件夹;如果我只是跑步cd 并按Tab,它会扩展为cd \~kernel-ppa/。我也不需要逃脱!
2014年

是。另外,如果您持续按TAB键,则会循环浏览其他可用补全。
Elliott Frisch

Answers:


10

如您所知,~扩展到您的主目录。但是您似乎错过了~john扩展到名为“ john”的用户的主目录。

检查/etc/passwd文件:

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

它有一个名为“系统用户”的名称kernoops(出于内部错误报告的原因)。因此,当您键入cd ~kTab外壳程序时,将在本地目录扩展之前为用户名扩展提供preference(1),并且您拥有cd ~kernoops。现在,结果是用户“ kernoops”的主目录为/,因此cd为它。

在我的shell中zsh,我没有双斜杠(2):

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

顺便说一句,这个目录名不是很好的考虑。脚本和其他方面都需要三重照顾。我能想到的唯一最糟糕的想法是在其中嵌入标签...


脚注:

(1)在中zsh,即使我有一个名为的目录~xdir,也没有用户以开头x;这样cd ~xTab做不会扩展并且不会引用Gives ~错误:

[:~/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变体(我将apollos与Domain / OS一起使用,用于该版本)//machine-name/...无缝访问其他计算机。本地网络中的文件系统(尚未发明安全性)。所以大概bash就在这里。但是,如果这样做,两个外壳都cd ///将具有普通/外壳。

是的,在unix.se上找到


1
另一个著名的旧版OS使用类似的双斜杠表示法,但是它的斜杠通常是向后写入的,我不确定它是否接受正斜杠来访问像这样的远程网络文件系统。;-)
R .. GitHub停止帮助ICE 2014年

7

代字号(~)在shell中具有特殊含义。在任何命令中看到它时,它都将扩展为您的主目录的名称。这样做cd ~或者cd /home/aditya是一样的,它在你的home目录结束。

通过\在代字号前面放置一个反斜杠字符(),可以告诉shell不要扩展以下特殊字符(这就是所谓的shell转义)。通过执行此操作cd \~,要求外壳程序移动到名为~您正在执行命令的目录下的目录。因此,这样做cd \~kernel-ppa会将您切换到名为的目录~kernel-ppa,这是正常行为。

编辑:更多〜

如果在后面写了系统的用户名,则将~移至该用户的主目录。Tab之后进行扩展cd ~将扩展为系统上现有的用户名。如果在此Tab之后完成cd ~k,它将扩展到〜kernoops,因为系统用户中有一个名为kernoops的用户,主目录为/。当cd ~k结果扩展为cd ~kernoops/带有斜杠和主目录时/,您将移至//。但这与其他人/早先所说的完全相同。


感谢您的回答。您的答案与@Rmano的答案完全可以消除混乱:)
Aditya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.