私は通常、bashプロンプト(PS1='\u@\h:\W$ '
)に現在のディレクトリの名前だけを持っているので、~/projects/superapp/src/
にいると次のようになります。
hamish@Host:src$
ただし、フルパスがなくてもフルパスを表示したいのですが。私は人々が持っているであろうスクリーンショットを見てきました
hamish@Host:~/p/s/src$
上記の例のディレクトリにある場合。では、PS1のどのような価値がそれをもたらすでしょうか?またはそれが失敗した場合、それを生成するために.bashrc
にどのスクリプトが必要ですか?
わかりました、興味があったので、ここに1つの解決策があります:
\$(function_name)
として適切な場所に配置します。例として:
short_pwd() {
cwd=$(pwd | Perl -F/ -ane 'print join( "/", map { $i++ < @F - 1 ? substr $_,0,1 : $_ } @F)')
echo -n $cwd
}
# later in your .bashrc
PS1="\u \$(short_pwd) \$ "
私よりもBashスクリプトに精通している人が、関数をクリーンアップする方法を提案できることを願っていますが、これにより、プロンプトで別のコマンド(またはBash関数)の出力を使用する方法がわかります。こちらもご覧ください: http://www.linux.org/docs/ldp/howto/Bash-Prompt-HOWTO/x279.html
あなたのコメントに基づいて、私はもう一度見て、私の解決策を二重引用符で囲む必要があることに気づきました。このような関数を一重引用符で囲むと、まったく機能しません。
私はmeowsqueakのアプローチが好きで、パフォーマンスのためにbashに留まろうとしています。しかし、長いディレクトリ名を1文字に短縮するパスが必要でした。
me@comp:~ $ cd my/path/haslongnames/
me@comp:~my/p/h $
これはmeowsqueakのソリューションに基づいています。それはいくつかの改善/より多くの機能に耐えることができますが、sedを起動することなく基本的な問題を解決します。
これは実行可能ファイルにあります。例:〜/ bin/ps1
# set this to whatever you want:
MAX_PWD_LENGTH=30
function shorten_pwd
{
# This function ensures that the PWD string does not exceed $MAX_PWD_LENGTH characters
PWD=$(pwd)
# determine part of path within HOME, or entire path if not in HOME
RESIDUAL=${PWD#$HOME}
# compare RESIDUAL with PWD to determine whether we are in HOME or not
if [ X"$RESIDUAL" != X"$PWD" ]
then
PREFIX="~"
fi
# check if residual path needs truncating to keep total length below MAX_PWD_LENGTH
NORMAL=${PREFIX}${RESIDUAL}
if [ ${#NORMAL} -ge $(($MAX_PWD_LENGTH)) ]
then
newPWD=${PREFIX}
OIFS=$IFS
IFS='/'
bits=$RESIDUAL
for x in $bits
do
if [ ${#x} -ge 3 ]
then
NEXT="/${x:0:1}"
else
NEXT="$x"
fi
newPWD="$newPWD$NEXT"
done
IFS=$OIFS
else
newPWD=${PREFIX}${RESIDUAL}
fi
# return to caller
echo $newPWD
}
export PS1="\u@\h:$(shorten_pwd) $ "
私の.bash_profileには、
Prompt_COMMAND="source $HOME/bin/ps1"
Prompt_DIRTRIM=3
\ wを強制的に、現在の作業ディレクトリパスの末尾の要素を最大3つまで展開し、前の要素がある場合は「...」に置き換えます。
その間にもう少しグーグルをしました、そしていくつかの検索用語を通過した後、私は この記事 に出くわしました 魚の殻 私が望むことをしますそしてそれを行う方法を提供しました。ユーザーとホストも表示され、適度に簡潔になるように変更しました。
# abbreviate the dir path
Prompt_COMMAND='CurDir=`pwd|sed -e "s!$HOME!~!"|sed -re "s!([^/])[^/]+/!\1/!g"`'
PS1="\u@\h:\$CurDir \$ "
基本的に、プロンプトが表示されるたびに、Prompt_COMMAND
は$CurDir
を短縮ディレクトリパスに設定します。このパスは$PS1
で使用されます。 Prompt_COMMAND
が他の場所に設定されている場合は、そのコマンドの最後に;
を付けて上記のコマンドを追加する必要があることに注意してください。したがって、xtermのタイトルを設定する一般的な例では、次のようになります。
Prompt_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"; CurDir=`pwd|sed -e "s!$HOME!~!"|sed -re "s!([^/])[^/]+/!\1/!g"`'
パスを短縮する他のいくつかの可能な方法を見つけることができます:
私は最近、数年前に書いた別のスクリプトに基づいてこれを書き直しました。これは、コストのかかるフォークを回避するために、可能な限りbash内で実行するように最適化されています。これは、awk/sedを使用していた私の古い関数よりもほぼ8倍高速でした。
それは素晴らしい結果を生み出します。プロンプトのpwd部分をMAX_PWD_LENGTH文字以下に保ち、$ HOMEのサブディレクトリにいる場合は、これも明確になります。
例:
pc770-ubu:~ $ cd ~/a/b/c
pc770-ubu:~/a/b/c $ cd d/e/f
pc770-ubu:~/a/b/c/d/e/f $ cd g
pc770-ubu:~/a/b/c/d/e/f/g $ cd h
pc770-ubu:~/a/b/c/d/e/f/g/h $ cd i
pc770-ubu:~/a/b/c/d/e/f/g/h/i $ cd j
pc770-ubu:~/a/b/c/d/e/f/g/h/i/j $ cd k
pc770-ubu:~/a/b/c/d/e/f/g/h/i/j/k $ cd l
pc770-ubu:~../c/d/e/f/g/h/i/j/k/l $ cd m
pc770-ubu:~../d/e/f/g/h/i/j/k/l/m $ cd n
pc770-ubu:~../e/f/g/h/i/j/k/l/m/n $ cd o
pc770-ubu:~../f/g/h/i/j/k/l/m/n/o $ cd /tmp/a/b/c/d/e/f
pc770-ubu:/tmp/a/b/c/d/e/f $ cd g
pc770-ubu:/tmp/a/b/c/d/e/f/g $ cd h
pc770-ubu:/tmp/a/b/c/d/e/f/g/h $ cd i
pc770-ubu:/tmp/a/b/c/d/e/f/g/h/i $ cd j
pc770-ubu:/../a/b/c/d/e/f/g/h/i/j $ cd k
pc770-ubu:/../b/c/d/e/f/g/h/i/j/k $ cd l
pc770-ubu:/../c/d/e/f/g/h/i/j/k/l $ cd m
pc770-ubu:/../d/e/f/g/h/i/j/k/l/m $ cd
pc770-ubu:~ $
Bash関数(PS1変数を作成するときにこれを呼び出します):
# set this to whatever you want:
MAX_PWD_LENGTH=20
function shorten_pwd
{
# This function ensures that the PWD string does not exceed $MAX_PWD_LENGTH characters
PWD=$(pwd)
# if truncated, replace truncated part with this string:
REPLACE="/.."
# determine part of path within HOME, or entire path if not in HOME
RESIDUAL=${PWD#$HOME}
# compare RESIDUAL with PWD to determine whether we are in HOME or not
if [ X"$RESIDUAL" != X"$PWD" ]
then
PREFIX="~"
fi
# check if residual path needs truncating to keep total length below MAX_PWD_LENGTH
# compensate for replacement string.
TRUNC_LENGTH=$(($MAX_PWD_LENGTH - ${#PREFIX} - ${#REPLACE} - 1))
NORMAL=${PREFIX}${RESIDUAL}
if [ ${#NORMAL} -ge $(($MAX_PWD_LENGTH)) ]
then
newPWD=${PREFIX}${REPLACE}${RESIDUAL:((${#RESIDUAL} - $TRUNC_LENGTH)):$TRUNC_LENGTH}
else
newPWD=${PREFIX}${RESIDUAL}
fi
# return to caller
echo $newPWD
}
編集:絶対文字列長のバグを修正
これを.bashrc
に追加する(そして好きなように編集する)だけです:
PS1='\u@\h:`pwd | sed -e "s/\/\(.\)[^\/]\+/\/\1/g"`\$ '
Perlを必要としない@Telemachusshort_pwd()の別のバージョン。
short_pwd() {
cwd=$(pwd)
if [ $cwd == $HOME ]; then echo -n "~"; return; fi
if [ $cwd == "/" ]; then echo -n "/"; fi
for l in $(echo $cwd | tr "/" "\n"); do
echo -n "/"
echo -n ${l:0:1}
done
echo -n ${l:1}
}
これを試して:
PS1='$(pp="$PWD/" q=${pp/#"$HOME/"/} p=${q%?};((${#p}>19))&&echo "${p::9}…${p:(-9)}"||echo "$p") \$'
変身
~/.vim/bundle/ack.vim/plugin
に
.vim/bund…im/plugin
トランスフロム
/usr/share/doc/xorg-x11-font-utils-7.5/
に
/usr/shar…utils-7.5
そしていつ$PWD
と同じ $HOME
、何も表示しません。
ボーナス:必要に応じて長さの数を変更できます。