简体   繁体   中英

Is there a good way to replace home directory with tilde in bash?

Im trying to work with a path and replace the home directory with a tilde in bash, Im hoping to get it done with as little external programs as necessary. Is there a way to do it with just bash. I got

${PWD/#$HOME/\~}

But thats not quite right. It needs to convert:

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

As a note of interest, heres how the bash source does it when converting the \w value in the prompt :

/* 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);
}

I don't know of a way to do it directly as part of a variable substitution, but you can do it as a command:

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

Note that this doesn't do exactly what you asked for: it replaces "/home/alice/" with "~/" rather than "~". This is intentional, since there are places where the trailing slash is significant (eg cp -R ~ /backups does something different from cp -R ~/ /backups ).

See this unix.stackexchange answer :

If you're using bash, then the dirs builtin has the desired behavior:

 dirs +0 ~/some/random/folder

That probably uses Bash's own C code that you pasted there. :)

And here's how you could use it:

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)

Note that this will only work with directory names that already exist.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM