AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 444383
Accepted
Neo_Returns
Neo_Returns
Asked: 2018-05-18 06:14:25 +0800 CST2018-05-18 06:14:25 +0800 CST 2018-05-18 06:14:25 +0800 CST

cd ~<user> 是可能的,但为什么我们不能 cd ~"$USER" 或 cd ~${USER}

  • 772

我很好奇为什么我们不能切换到用户的主目录

$ cd ~"$USER"

或者

$ cd ~${USER}
shell command-line
  • 5 5 个回答
  • 1663 Views

5 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-05-18T06:24:21+08:002018-05-18T06:24:21+08:00

    这在很大程度上取决于外壳以及在这些外壳中进行扩展的顺序。

    ~$user扩展至用户的主目录,其名称存储在$usercsh(该~user功能的来源)、AT&T ksh、zsh、fish 中。

    但是请注意这些变化:

    $ u=daemon/xxx csh -c 'echo ~$u'
    /usr/sbin/xxx  # same in zsh/fish
    $ u=daemon/xxx ksh93 -c 'echo ~$u'
    ~daemon/xxx
    
    $ u=daemon/xxx csh -c 'echo ~"$u"'
    Unknown user: daemon/xxx.
    $ u=daemon/xxx zsh -c 'echo ~"$u"'
    /usr/sbin/x  # same in fish
    
    $ u=" daemon" csh -c 'echo ~$u'
    /home/stephane daemon
    $ u=" daemon" zsh -c 'echo ~$u'
    ~ daemon  # same in ksh/fish
    
    $ u="/daemon"  csh -c 'echo ~$u'
    /home/stephane/daemon  # same in zsh
    $ u="/daemon"  fish -c 'echo ~$u'
    ~/daemon  # same in ksh
    

    它扩展到字面上命名的用户的主目录$user(bash假设用户存在,当然这不太可能)。

    并且在pdksh, dash,中都没有yash,大概是因为他们不认为$user是有效的用户名。

    • 20
  2. Kusalananda
    2018-05-18T06:21:37+08:002018-05-18T06:21:37+08:00

    波浪号扩展是命令行处理中的一个单独步骤。它发生在变量扩展之前。

    如果波浪号后跟斜杠以外的其他内容,它将扩展到名称跟在波浪号后面的用户的主目录,例如,~otheruser. 由于$USER此时未展开并且由于它不太可能对应于有效的用户名,因此波浪号未展开。

    $USER可能是当前用户的用户名,因此您的表达式可能会被替换为~.

    • 10
  3. kasperd
    2018-05-18T14:23:29+08:002018-05-18T14:23:29+08:00

    正如其他答案所指出的那样,行为取决于外壳执行的顺序~和$扩展,以及它是否甚至会为同一个词执行这两种操作。

    您正在寻找的行为可以bash通过对您的命令进行非常小的更改来实现。只需在命令前加上eval.

    eval "cd ~$USER"
    

    将更改为由变量中的用户名给出的用户的主目录USER,前提$USER是不包含 shell 特殊的字符(如果有可能发生这种情况,则不应将其作为参数传递给,eval因为那会很危险) 或/字符,并且系统的用户数据库中有该用户的条目。

    • 6
  4. zwol
    2018-05-18T08:09:19+08:002018-05-18T08:09:19+08:00

    如果您使用的是在变量扩展之前发生波浪号扩展的外壳之一,则查找变量用户主目录的另一种方法是使用getent。该工具至少存在于 Linux、Solaris 和 FreeBSD 上;我不确定它有多普遍。

    $ USER=bloggs
    $ getent passwd "$USER" | cut -d: -f6
    /home/b/bloggs
    

    su - $USER -c 'echo $HOME'与波浪号扩展一样,如果您有权限执行此操作,这可能不会为您提供打印的相同内容。

    • 3
  5. jamesqf
    2018-05-19T17:50:31+08:002018-05-19T17:50:31+08:00

    由于OP坚持要答案,所以就在这里。

    这些命令(以及许多其他东西)的行为取决于您碰巧使用的特定 shell。除非您指定您使用的特定外壳,否则可能无法给出简单的答案。

    事实上,如果您像我一样使用 tcsh,那么 OP 问题中的两个表达式(正如我写这篇文章时所写的那样 - 我对未来的编辑不承担任何责任!)工作得很好。我不知道其他 shell 会做什么,因为我不使用它们。因此,也许 OP 并不像他/她认为的那样了解可以做什么:-)

    • -2

相关问题

  • 使 mysql CLI 以交互方式向我询问密码

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 没有服务器的命令行 pub/sub?

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve