/ home / user1 / fooから〜/ fooを取得する方法は?


0

Bashプロンプトは\wエスケープシーケンスをサポートしています。

\w     the current working directory, with $HOME abbreviated
       with a tilde (uses the value of the PROMPT_DIRTRIM variable)

任意の文字列に対して同様の略語を取得する方法はありますか?つまり、HOME = / home / user1の場合、次のようなことを行う一般的なコマンドはありますか

/home/user1          ~
/home/user1/a/1      ~/a/1
/home/user2/b/2      ~user2/b/2
/root                ~root

確かに、sedでsomethingいことを試すこともできますが、いずれにしても、私が望む結果が得られる可能性は低いです。:-)

この背後にある動機は、端末のタブのタイトルをできるだけ短くしたいということです。したがって、可能な場合は作業ディレクトリを省略します。

更新:満足のいく解決策が簡単に入手できるとは思えないので、物事を十分に高速に保ちたいので、今は簡単な

pwd | sed -e "s|/root|~root|" -e "s|/home/user1|~|

そしてルートのために似たようなもの。私はマシン上の唯一のユーザーであるため、これは現在多かれ少なかれ機能しています。誰かがmagical-tool-that-solves-all-problems思い付く場合に備えて質問を公開しておきます(elispで書かれていないことが理想的です...)。


「すべてをできるだけシンプルにしますが、シンプルではありません。」—アルバートアインシュタイン。 s|/home/user1|~|変更されます/home/user17~7
スコット

回答:


2

独自のホームディレクトリには、を使用しますdir="${PWD/#$HOME/~}"

/home/glennが示唆するとおりにストリップするには、を使用しますdir="${dir/#\/home\//~}"


他のユーザーのhomedirの変換は、すべてのユーザーを毎回リストする必要があるため、はるかに複雑です。

  • いくつかの最初のアカウント/には常に一致するhomedirがあるため、最初の一致で停止することさえできません。代わりに、最も長いプレフィックスをチェックする必要がありますが、これは単純ではありません。

  • LDAPからユーザーアカウントを読み取るように構成されたサーバーで作業することがよくありますが、すべてのアカウントを一覧表示するには1秒かかります。一方、Active Directoryはリスト全体を表示することさえできません。


あなたは「通常」のユーザーは、その後、「/ホーム/」で始まるホームディレクトリを持っていることを前提とする場合case "$PWD/" in ($HOME/*) dir="${PWD/#$HOME/~}" ;; (/home/*) dir="~${PWD:6}" ;; (*) dir="$PWD" ;; esac; echo "$dir"
グレン・ジャックマン

@grawity:はい、戻るよりも戻るのが少し難しいことがわかりますが、最後に死ぬことを望みます。@Glenn:これはすでに失敗しています/root。代わりに手書きのリストを使用しますが、関心をお寄せいただきありがとうございます。:)
クラウディウス

1

現在のユーザー、およびという変数に格納されている文字列の場合DIR、これは機能します。${DIR/~/\~}

これは、変数~の値$HOMEまたは現在のユーザーのホームディレクトリであるの展開をリテラルで置き換え~ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.