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 に答える