web-dev-qa-db-ja.com

bashプロンプトの現在のパスをディレクトリごとに1文字に短縮するにはどうすればよいですか?

どこかは思い出せませんが、bashプロンプトの現在のパスが興味深い方法で短縮されているのを既に見ました。パスに含まれるすべてのディレクトリ(最後のディレクトリを除く)は、最初の文字だけで置き換えられます。たとえば、path/to/some/directoryp/t/s/directoryに短縮されます。

どうすればその動作を再現できますか?

8
Anto

しばらくこれで遊んだ後、私はあなたが必要とする答えを得ました:

これをホームディレクトリの.bashrcファイルに追加し、ターミナルを終了して借用すると、プロンプトが表示されます。

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/([^/]{,2})[^/]*|/\1|g'
}

宣言された関数sps()を使用して、プロンプトである変数PS1が表示されるたびにパスを評価します

すなわち

/ho/de/De/Ap/Ti$ pwd
/home/deth/Desktop/Apps/Tivo
/ho/de/De/Ap/Ti$ 

または... 1文字を主張する場合

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/(.)[^/]*|/\1|g'
}

表示されるもの:

/h/d/D/A/T$ pwd
/home/deth/Desktop/Apps/Tivo
/h/d/D/A/T$ 
7
Meer Borg

最後のディレクトリ名を除くすべてのディレクトリ名を切り捨てるには:

PS1='$(eval "sps")$ '                                                                                
sps() {                                                                                              
    python -c "import sys; dirs = sys.argv[1].split('/'); print '/'.join(d[:1] for d in dirs[:-1]) + '/' + dirs[-1]" $PWD
}
2
askory

次のように、1文字のディレクトリのベストアンサー(Meer Borgの)正規表現が壊れています。

echo "/home/user/x/next_dir/other_dir" | sed -r 's|/(..)[^/]*|/\1|g'
/ho/us/x//ot

正しい関数は

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/([^/]{,2})[^/]*|/\1|g'
}

申し訳ありませんが、元の答えの下でコメントする評判はありません、笑

2
mario1ua