【问题标题】:Meaning of tilde in Linux bash (not home directory)Linux bash 中波浪号的含义(不是主目录)
【发布时间】:2010-11-03 04:10:00
【问题描述】:

首先,我知道~/ 是主目录。 CDing 到 ~~/ 会将我带到主目录。

但是,cd ~X 将我带到了一个特殊的地方,X 似乎是什么。

在 bash 中,如果我点击“cd ~”并点击选项卡,它会显示一堆可能的~X 选项,例如~mail~postgres~ssh。转到这些文件夹并执行pwd 告诉我这些文件夹不在主目录中;他们到处都是。

它们不是别名。我已经检查过了。 它们不是env. 变量,否则它们需要$

什么是设置这些链接,我在哪里可以找到这些设置的位置?

【问题讨论】:

  • ~X 只返回文字 "~X" 但 ~ 返回 $HOME 和 ~+ 返回 $PWD - 除了获取 shell 变量之外,它们并没有什么特别之处。即它们不存储值或执行命令来查找它们。它们已经被定义。你试过吗~-?我想不出它的用途,但同样,它返回一个 shell 变量 $OLDPWD

标签: linux bash home-directory


【解决方案1】:

这是一个名为“tilde expansion”的 Bash 功能。这是外壳的功能,而不是操作系统。例如,使用 csh 你会得到不同的行为。

回答有关信息来自何处的问题:您的主目录来自变量$HOME(无论您在那里存储什么),而其他用户的主目录则使用getpwent() 实时检索。该功能通常由NSS控制;因此默认情况下会从/etc/passwd 中提取值,尽管可以将其配置为使用所需的任何来源(例如 NIS、LDAP 或 SQL 数据库)检索信息。

波浪号扩展不仅仅是主目录查找。总结如下:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirs~1~-1等,与pushdpopd配合使用。

【讨论】:

  • 作为注释fish 不支持除普通波浪号 (~) 之外的任何一个
  • 他们为什么提出~+?似乎没什么用。
  • ~+ 与 .但是,要使用 ./file 之类的东西,它必须转到文件系统并找出 .位于 - 它需要几个周期。使用 ~+ 通过简单地返回 shell 变量 $PWD 的内容来节省工作,该变量在您遍历文件系统时已经定义。
【解决方案2】:

那些是用户。检查您的/etc/passwd

cd ~username 将您带到该用户的主目录。

【讨论】:

  • FTW。点赞。 TNX 来解决这个问题。我想知道该循环涉及多少个循环,甚至可能涉及一个子shell。试想一下,如果您的系统有 3K 用户,例如在小型 ISP 中。哎呀。
【解决方案3】:

您可能会看到 OpenDirectory/ActiveDirectory/LDAP 用户“自动挂载”到您的主目录中。

在 *nix 中,~ 将解析到您的主目录。同样~X 将解析为“用户 X”。

类似于自动挂载目录,OpenDirectory/ActiveDirectory/LDAP 用于较大/企业环境中自动挂载用户目录。这些用户可能是真实的人,也可能是为提供各种功能而创建的机器帐户。

如果您键入 ~Tab,您将看到您计算机上的用户列表。

【讨论】:

    【解决方案4】:

    如果您使用的是autofs,那么扩展实际上可能来自/etc/auto.home(或类似的发行版)。例如,我的/etc/auto.master 看起来像:

    /home2 auto.home --timeout 60
    

    /etc/auto.home 看起来像:

    mgalgs -rw,noquota,intr space:/space/mgalgs
    

    【讨论】:

      【解决方案5】:

      这些是用户的主目录。例如,试试cd ~(your username)

      【讨论】:

      • 它们不是符号链接,服务帐户在 /home 下没有主目录
      • 就我而言最好的答案。另外,在我的特殊情况下,它是根目录/文件夹,而不是主文件夹。
      【解决方案6】:

      在我的机器上,由于我的设置方式,正在做:

      cd ~             # /work1/jleffler
      cd ~jleffler     # /u/jleffler
      

      首先注意环境变量$HOME的值;我故意将我的$HOME 设置为本地文件系统,而不是 NFS 挂载的文件系统。第二个从密码文件中读取(大约;NIS 使事情有点复杂),发现密码文件说我的主目录是 /u/jleffler 并更改到该目录。

      烦人的事情是大多数软件的行为都与上述相同(并且 shell 的 POSIX 规范需要这种行为)。我使用了一些软件(而且我没有太多选择),将密码文件中的信息视为 $HOME 的当前值,这是错误的。

      将此应用于问题 - 正如其他人指出的那样,“cd ~x”转到用户“x”的主目录,更一般地说,每当完成波浪号扩展时,~x 表示用户的主目录'x'(如果用户'x'不存在则错误)。


      值得一提的是:

      cd ~-       # Change to previous directory ($OLDPWD)
      cd ~+       # Change to current directory ($PWD)
      

      我无法立即找到“~+”的用途,除非您在通向当前目录的路径中移动符号链接来做一些奇怪的事情。

      你也可以这样做:

      cd -
      

      意思和~-一样。

      【讨论】:

      • 关于cd ~+:您可能会使用它来检查您当前所在的目录是否仍然存在——即使这是一种非常非正统的方式。
      【解决方案7】:

      【讨论】:

        【解决方案8】:

        它们是/etc/passwd 中用户的主目录吗? postgres、sendmail、apache 等服务创建的系统用户与普通用户一样具有主目录。

        【讨论】:

        • 确实是~username是指定用户的主目录
        猜你喜欢
        • 1970-01-01
        • 2014-07-15
        • 2013-07-10
        • 2011-08-10
        • 2012-04-19
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多