回答:
bashを使用しdirs
ている場合、組み込みは望ましい動作をします。
dirs +0
~/some/random/folder
(注意+0
、ではありません-0
。)
でzsh
:
dirs
~/some/random/folder
正確に言うと、最初にディレクトリスタックをクリアする必要があります。そうしdirs
ないと、すべてのコンテンツが出力されます。
dirs -c; dirs
またはzsh
のprint
組み込み機能:
print -rD $PWD
または
print -P %~
(1ターンそのプロンプト展開に。%~
で$PS1
、現在のディレクトリに展開して$HOME
と置き換える~
だけでなく、他の扱いという名前のディレクトリ他のユーザーまたはのホームディレクトリのような名前のディレクトリをあなた自身を定義すること)。
Bash変数のサブストリング置換機能を使用できます。
$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
ksh
およびでも機能しzsh
ます。
${string/#substring/replacement}
この動作を防ぐために、バージョンへの回答を置き換えました。
echo
で)zsh
。他のシェルで$HOME
は、パターンとして扱われ、すべてがsplit + globの対象となります。
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
を使用してsed
:
pwd | sed "s|^$HOME|~|"
アイデアは、sed
正規表現の区切り文字としてホームディレクトリパスに表示される可能性が低い文字を使用することです。上記の例ではを使用してい|
ます。
この手法の良いところは、実際にはシェルに依存しないことです。
をエイリアスpwd
し/bin/pwd | sed "s|$HOME|~|"
て、を使用している可能性のある他のスクリプトでこの動作を取得することもできますpwd
。
^
正規表現にアンカーを含める必要があります。それ以外の場合、パスの途中のセグメントを置き換えることは(可能性は低いですが)可能です。
"s|^/home/user\(/.*\)\?$|~\1|"
。それらの名前が似ている場合はそれ以外の場合は、他のユーザのパスに一致しuser1
、user2
、user3
とあなただけの一致user
tilde=\~${PWD#~}
それがあなたが欲しいと思う?
チルダの利点は、引用符を必要としないパターンとして展開されることです。$HOME
引用符なしで同じ方法で使用すると、構成文字のいずれかがパターン文字になる可能性があるため、予測できない結果が表示され、常に期待どおりの結果が表示されない場合があります。
しかし、チルダ展開は、引用符で囲まれた展開の結果であるかのように常に発生するように指定されているため、その結果は予測可能です。これは私が両方のためにテストした実質的にすべてのシェルに当てはまるように思われるcase
の両方の顕著な例外を除いて、パターンやパラメータパターンksh93
とmksh
その能力にチルダの引用された側面を称えるように見えるどちらも-何らかの理由のために。
これに関するもう1つの便利な点は、$HOME
すべてのディレクトリを同じ方法で処理するように再定義できることです。例えば:
cd ~
HOME=/some/prefix/I/would/like/to/trim
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD
別の例を次に示します。
set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
HOME=${*#~/}/$d
set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~
$PWD
は以下であると仮定し$HOME
ます。同じ考えをパターン置換と組み合わせて、より一般的にすることもできます。どう${PWD/#~/\~}
?
不要な部分をsed
次のように置き換えてみてください:
pwd | sed 's,^/data/users/me,~,'
またはさらに良い:
pwd | sed "s,^$HOME,~,"
^
アンカーを使用して、ディレクトリパスの先頭にある一致のみが置換されるようにする必要があります。また、g
コマンドは最大1つのオカレンスを置換する必要があるため、使用する必要はありません。
/home/alice
で、現在のディレクトリがの場合は問題があり/home/aliceinchains
ます。ただし、この機能を使用したいのが、自分が自分のホームディレクトリまたはそのサブディレクトリの1つであることを知っているときだけであれば、機能するはずです。