Подтвердить что ты не робот

Есть ли хороший способ заменить домашний каталог тильдой в bash?

Я пытаюсь работать с контуром и заменять домашний каталог тильдой в bash, я надеюсь, что это будет сделано с минимальными внешними программами по мере необходимости. Есть ли способ сделать это только с помощью bash. Я получил

${PWD/#$HOME/\~}

Но это не совсем правильно. Он должен преобразовать:

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

В качестве примечания интересно, как это делает источник bash при преобразовании значения \w в подсказке:

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

Ответ 1

Смотрите этот ответ unix.stackexchange:

Если вы используете bash, то встроенный встроенный dirsповедение:

dirs +0
~/some/random/folder

Это, вероятно, использует Bash собственный C-код, который вы вставили там.:)

И вот как вы могли его использовать:

dir=...                     # <- Use your own here.
pushd "$dir" > /dev/null    # Switch to the given directory;
                            # suppress output.
dir_with_tilde=$(dirs +0)   # Run "dirs" and save to variable.
popd > /dev/null            # Switch back to where we were

Ответ 2

Я не знаю, как это сделать непосредственно как часть подстановки переменных, но вы можете сделать это как команду:

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

Обратите внимание, что это не делает именно то, что вы просили: он заменяет "/home/alice/" на "~/", а не "~". Это преднамеренно, поскольку существуют места, где конечная косая черта значительна (например, cp -R ~ /backups делает что-то отличное от cp -R ~/ /backups).

Ответ 3

Я сделал это с простой заменой строки bash:)

> echo $HOME
/Users/fots
> mypath="/Users/fots/some/cool/path"
> echo ${mypath/$HOME/\~}
~/some/cool/path