「〜」に関してpwdの結果を作成しますか?


28

pwd 私にくれます

/data/users/me/some/random/folder

入手する簡単な方法はありますか

~/some/random/folder

からpwd


sedを介したパイピングはオプションですか?
マシューD.ショールフィールド

7
これを行う場合は、結果のコマンドに以外の名前を付けることを強くお勧めしpwdます。そうしないと、チルダ展開を実行しないコンテキストでその出力を使用することを期待するスクリプトが破損します。
チャールズダフィー

回答:


25

bashを使用しdirsている場合、組み込みは望ましい動作をします。

dirs +0
~/some/random/folder

(注意+0、ではありません-0。)

zsh

dirs
~/some/random/folder

正確に言うと、最初にディレクトリスタックをクリアする必要があります。そうしdirsないと、すべてのコンテンツが出力されます。

dirs -c; dirs

またはzshprint組み込み機能:

print -rD $PWD

または

print -P %~

(1ターンそのプロンプト展開に。%~$PS1、現在のディレクトリに展開して$HOMEと置き換える~だけでなく、他の扱いという名前のディレクトリ他のユーザーまたはのホームディレクトリのような名前のディレクトリをあなた自身を定義すること)。


私は常にbashとzshを切り替えます。残念ながら、この解決策により、シェル間の違いを覚えておく必要があり、現在の場所を覚える(確認する)こともできます。@Bichoyによる答えは、これら2つのシェルにとらわれません。
AVP

18

Bash変数のサブストリング置換機能を使用できます。

$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar

2
これはkshおよびでも機能しzshます。
mr.spuratic

1
最も簡単な方法なので、この答えを支持しましたが、ここには小さな警告があります:/ tmp / home / username内では、これは/ tmp〜を返します。これを修正するために$ HOMEの前にキャレット記号を挿入する方法が見つかりません。ソリューションを完璧にする必要がある場合は、これを使用しないでください
。– 0fnt

1
@ user18151、これを指摘してくれたあなたより。${string/#substring/replacement}この動作を防ぐために、バージョンへの回答を置き換えました。
-Nykakin

1
@ mr.spuraticそれは(の使用を除き、唯一の正しいだechoで)zsh。他のシェルで$HOMEは、パターンとして扱われ、すべてがsplit + globの対象となります。
ステファンシャゼル

チルダ( '〜')をエスケープすると、トリックが行われました。\〜も機能することに注意してください。これは、 ' PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
-context

7

を使用してsed

pwd | sed "s|^$HOME|~|"

アイデアは、sed正規表現の区切り文字としてホームディレクトリパスに表示される可能性が低い文字を使用することです。上記の例ではを使用してい|ます。

この手法の良いところは、実際にはシェルに依存しないことです。

をエイリアスpwd/bin/pwd | sed "s|$HOME|~|"て、を使用している可能性のある他のスクリプトでこの動作を取得することもできますpwd


2
^正規表現にアンカーを含める必要があります。それ以外の場合、パスの途中のセグメントを置き換えることは(可能性は低いですが)可能です。
シルドレス

実際には、正規表現は次のようになります"s|^/home/user\(/.*\)\?$|~\1|"。それらの名前が似ている場合はそれ以外の場合は、他のユーザのパスに一致しuser1user2user3とあなただけの一致user
AVP

3
tilde=\~${PWD#~}

それがあなたが欲しいと思う?

チルダの利点は、引用符を必要としないパターンとして展開されることです。$HOME引用符なしで同じ方法で使用すると、構成文字のいずれかがパターン文字になる可能性があるため、予測できない結果が表示され、常に期待どおりの結果が表示されない場合があります。

しかし、チルダ展開は、引用符で囲まれた展開の結果であるかのように常に発生するように指定されているため、その結果は予測可能です。これは私が両方のためにテストした実質的にすべてのシェルに当てはまるように思われるcaseの両方の顕著な例外を除いて、パターンやパラメータパターンksh93mkshその能力にチルダの引用された側面を称えるように見えるどちらも-何らかの理由のために。

これに関するもう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
~

1
それは本当に興味深いアプローチです。しかし、それ$PWDは以下であると仮定し$HOMEます。同じ考えをパターン置換と組み合わせて、より一般的にすることもできます。どう${PWD/#~/\~}
ミケル

1
実際、Nykakinの答えは基本的にそれです。
ミケル

0

不要な部分をsed次のように置き換えてみてください:

pwd | sed 's,^/data/users/me,~,'

またはさらに良い:

pwd | sed "s,^$HOME,~,"

1
^アンカーを使用して、ディレクトリパスの先頭にある一致のみが置換されるようにする必要があります。また、gコマンドは最大1つのオカレンスを置換する必要があるため、使用する必要はありません。
シルドレス

ありがとうございました。私はまだこのことを学んでおり、あなたのコメントは本当に役に立ちます。
user1403360

ホームディレクトリが/home/aliceで、現在のディレクトリがの場合は問題があり/home/aliceinchainsます。ただし、この機能を使用したいのが、自分が自分のホームディレクトリまたはそのサブディレクトリの1つであることを知っているときだけであれば、機能するはずです。
ミハイダニラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.