~/Mary 是相对路径吗?

Ale*_*lex 36 directory syntax

让我们假设Mary是一个目录。下面的路径是~/Mary相对的吗?

Eig*_*ony 73

不,这不是相对的。

这是一个完整的路径,~作为别名。

相对路径描述了与当前目录位置相关的路径。但是,~/Mary无论您当前在哪个目录中,都是完全相同的。

假设您当前以Bob 的身份登录并且也在目录中/home/Bob,那么../Mary将是/home/Mary. 如果您目前在,/etc/something那么~/Mary仍然是,/home/Bob/Mary../Mary现在是/etc/Mary

请注意,Bash~以特定方式处理,并且它并不总是转换为$HOME.

如需进一步阅读,请参阅

  • 我会避免将 `~` 称为别名;该名称已被使用。相反,它只是一个令牌,它是不同的 shell 功能(波浪号扩展)的一部分。除了`~`和`~user`之外,还有`~+`、`~-`、`~2`、`~+1`、`~-3`等绝对和相对目录栈表达式. (21认同)
  • `~/Mary` 是 `/home/youruser/Mary`,`~Mary` 是 `/home/Mary`。 (18认同)
  • `/home/Bob` 中的 `../Mary` 不会引用 `/home/Bob/Mary`,它会引用 `/home/Mary`。也许你打算写`/home/Bob/something`? (9认同)
  • @Cœur,所有数字用户名都不是一个好主意,因为有几个命令在同一上下文中同时接受用户名和用户 ID(例如 `find -user 0`、`ps -u 0`...) (3认同)

Sté*_*las 50

如果这~/Mary是给任何系统调用的路径(例如open()stat()...),那么它就是一个相对路径,它是Mary~当前目录中的目录相关的条目。因此,如果您的当前目录是/tmp例如,那将是该/tmp/~/Mary文件。

但是,如果~/Mary在支持波浪号扩展的 shell(或其他工具)中不加引号地使用它,那么~它将被$HOME变量的内容(如果已设置)替换,并且$HOME通常包含一个绝对路径,例如/home/me~/Mary将被扩展为/home/me/Mary,所以也是绝对路径。

如果您更改$HOME为相对路径(但您不想这样做),那么~/Maryshell 将扩展为相对路径:

$ HOME=..; echo ~/Mary
../Mary
Run Code Online (Sandbox Code Playgroud)

如果将其更改为//foo(或者如果您的主目录曾经/是 常见的root),则 的扩展~/Mary既不是绝对路径名也不是相对路径名(至少根据 POSIX 定义)。

使用bash4.0 之前的版本,您甚至可以做一些有趣的事情,例如:

$ HOME='*' bash-3.2.48 -c 'cd /; echo ~/mount'
bin/mount run/mount
Run Code Online (Sandbox Code Playgroud)

(这是在 4.0 中修复的)

有关Unix 和 Linux 的更多信息,请访问

  • 看起来 `HOME=.` 也能用,你可以用 `HOME='~' 找点乐子;cd` 生成错误,如 `bash: cd: ~: No such file or directory`。哇,这个兔子洞好深啊…… (3认同)
  • Egads。像`HOME=..` 这样的亲戚`$HOME` 是可怕的。 (2认同)
  • @AdamKatz,像 `HOME='*'` 这样的通配符 `$HOME` 怎么样(见编辑);-) (2认同)

hil*_*red 7

让我们学究。

正如其他人所说,它是一个别名;因此,它既不是绝对路径也不是相对路径。实际上,它是一个绝对路径,因为它与工作目录无关。

现在了解详情。在操作系统级别,不支持别名,因此所有绝对路径都以斜杠开头的规则成立,其他一切都是相对路径。然而,应用程序可能不只是通过名称内核:进行特殊的处理:~并且-是常见的,取决于应用。-用于启动选项,以确保您使用的是相对路径,您可以./在几乎所有情况下预先强制进行相对处理(据我所知,唯一的例外是主机名在rcp或 的某些实现中包含斜杠scp)。识别:用于检测某些命令的 url 和远程主机并引导// 在某些情况下也有特殊含义,但所有这些情况都是应用程序级别的问题,而不是操作系统级别的问题。

几乎所有的 shell(我知道有一个例外)和许多 Unix 应用程序都支持基本的波浪号扩展。最有可能工作的两个波浪号扩展是~/path(其中前导波浪号被$HOME变量的内容替换)和~name/path(在name用户数据库中查找where以定位用户name的主目录)。如果用户数据库不包含绝对路径(不要这样做)或$HOME不包含绝对路径(也不要这样做),那么它变得时髦的地方。也可能存在其他形式的波浪号扩展;例如,Bash 扩展~-到之前的工作目录,同样是在应用程序级别(并且 shell 是一个应用程序)。

  • 不错,我不知道最后一部分。`~-` 是 `$OLDPWD` 和 `~+N` 的别名,`~-N` 可用于从目录堆栈的顶部或底部到达第 N 个位置(由 `pushd` 和`popd`)。在 `man bash` 或 `man zshexpn` 中搜索 `~-` 以了解更多信息。 (3认同)

归档时间:

查看次数:

10420 次

最近记录:

7 年,11 月 前