29

我尝试使用路径并用 bash 中的波浪号替换主目录,我希望用尽可能少的外部程序来完成它。有没有办法只用bash来做到这一点。我有

${PWD/#$HOME/\~}

但这并不完全正确。它需要转换:

/home/alice to ~
/home/alice/ to ~/
/home/alice/herp to ~/herp
/home/alicederp to /home/alicederp

值得一提的是,在提示符中转换 \w 值时,bash 源代码是如何做到的:

/* Return a pretty pathname.  If the first part of the pathname is
   the same as $HOME, then replace that with `~'.  */
char *
polite_directory_format (name)
     char *name;
{
  char *home;
  int l;

  home = get_string_value ("HOME");
  l = home ? strlen (home) : 0;
  if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/'))
    {
      strncpy (tdir + 1, name + l, sizeof(tdir) - 2);
      tdir[0] = '~';
      tdir[sizeof(tdir) - 1] = '\0';
      return (tdir);
    }
  else
    return (name);
}
4

2 回答 2

19

我不知道作为变量替换的一部分直接执行此操作的方法,但您可以将其作为命令执行:

[[ "$name" =~ ^"$HOME"(/|$) ]] && name="~${name#$HOME}"

请注意,这并不完全符合您的要求:它将“/home/alice/”替换为“~/”而不是“~”。这是故意的,因为有些地方的斜线很重要(例如cp -R ~ /backups,与 不同的东西cp -R ~/ /backups)。

于 2012-04-05T23:07:43.783 回答
13

请参阅此 unix.stackexchange 答案

如果您使用的是 bash,则dirs内置函数具有所需的行为:

dirs +0
~/some/random/folder

这可能使用您粘贴在那里的 Bash 自己的 C 代码。:)

以下是你如何使用它:

dir=...    # <- Use your own here.

# Switch to the given directory; Run "dirs" and save to variable.
# "cd" in a subshell does not affect the parent shell.
dir_with_tilde=$(cd "$dir" && dirs +0)

请注意,这仅适用于已存在的目录名称。

于 2016-07-19T15:04:46.580 回答