57

私は Ubuntu を使用していますが、深いディレクトリ階層で作業しているときに、bash で長いプロンプトが表示されることにうんざりしています。そこで、PS1 を微調整して、次の方法で作業ディレクトリの部分を短くしたいと思います。

現在私は持っています:

pajton@dragon:~/workspace/projects/project1/folder1/test$

したい:

pajton@dragon:~/workspace/.../folder1/test$

len($PWD) が所定のしきい値を超えると、切り捨てが発生します。最初のパス コンポーネントと少なくとも 1 つの最後のパス コンポーネントを常に保持したいと考えています。次に、スペースが許す限り、右からコンポーネントを追加します。

これは私が現在持っているものです。動作しますが、1) 最初のパス コンポーネントを保持しません。2) 境界での切断パスを考慮しません。

pwd_length=14
pwd_symbol="..."
newPWD="${PWD/#$HOME/~}"

if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ]
then
   newPWD="...$(echo -n $PWD | sed -e "s/.*\(.\{$pwd_length\}\)/\1/")"
else
   newPWD="$(echo -n $PWD)"
fi

そして結果:

pajton@dragon:...sth/folder1/sample$ 

前もって感謝します!

4

11 に答える 11

123

はるかに単純なソリューションを探していて、パスの最初のディレクトリの名前を必要としない人のために、Bash にはPROMPT_DIRTRIM変数を使用した組み込みのサポートがあります。ドキュメントから

PROMPT_DIRTRIM

ゼロより大きい数値に設定すると、\w および \W プロンプト文字列エスケープを展開するときに保持する末尾のディレクトリ コンポーネントの数として値が使用されます (プロンプトの出力を参照)。削除された文字は省略記号に置き換えられます。

例えば:

~$ mkdir -p a/b/c/d/e/f
~$ cd a/b/c/d/e/f
~/a/b/c/d/e/f$ export PROMPT_DIRTRIM=2
~/.../e/f$ PROMPT_DIRTRIM=3
~/.../d/e/f$ 

欠点: パスの長さではなく、ディレクトリ レベルに依存するため、望ましくない場合があります。

利点: とてもシンプルです。に追加export PROMPT_DIRTRIM=2するだけ.bashrcです。

于 2011-12-08T08:49:32.977 に答える
48

あなたのケースでは、sed の代わりに awk を使用するこのスクリプトを検討してください。

pwd_length=14
pwd_symbol="..."
newPWD="${PWD/#$HOME/~}"
if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ]
then
   newPWD=$(echo -n $newPWD | awk -F '/' '{
   print $1 "/" $2 "/.../" $(NF-1) "/" $(NF)}')
fi
PS1='${newPWD}$ '

ディレクトリの例で~/workspace/projects/project1/folder1/testは、PS1を次のように作成します。~/workspace/.../folder1/test

アップデート

上記のソリューションはプロンプトを設定しますが、コメントで指摘したように、ディレクトリを変更しても PS1 は動的に変更されません。したがって、ディレクトリを変更したときに PS1 を動的に設定するソリューションは次のとおりです。

次の 2 行を .bashrc ファイルに追加します。

export MYPS='$(echo -n "${PWD/#$HOME/~}" | awk -F "/" '"'"'{
if (length($0) > 14) { if (NF>4) print $1 "/" $2 "/.../" $(NF-1) "/" $NF;
else if (NF>3) print $1 "/" $2 "/.../" $NF;
else print $1 "/.../" $NF; }
else print $0;}'"'"')'
PS1='$(eval "echo ${MYPS}")$ '

if (NF > 4 && length($0) > 14)awk の条件は、現在のディレクトリが 3 つ以上のディレクトリの深さで$PWDあり、長さが 14 文字を超える場合にのみ特別な処理を適用し、それ以外の場合は PS1 をそのまま保持し$PWDます。

例: 現在のディレクトリが~/workspace/projects/project1$PS1 の場合~/workspace/projects/project1$

上記の .bashrc の効果は、PS1 では次のようになります。

~$ cd ~/workspace/projects/project1/folder1/test
~/workspace/.../folder1/test$ cd ..
~/workspace/.../project1/folder1$ cd ..
~/workspace/.../project1$ cd ..
~/.../projects$ cd ..
~/workspace$ cd ..
~$

ディレクトリを変更すると、プロンプトがどのように変化するかに注目してください。これがあなたが望んでいたものではない場合はお知らせください。

于 2011-04-16T15:43:41.637 に答える
9

これは、anubhava のソリューションに基づいて私が使用するものです。プロンプトとウィンドウ タイトルの両方を設定します。awk スクリプトはより読みやすいので、簡単に微調整/カスタマイズできます。

パスが 16 文字を超え、深さが 4 レベルを超える場合、パスは折り畳まれます。さらに、折りたたまれたディレクトリの数も表示されるので、パスがどれだけ深いかがわかります。つまり、~/usr/..4../path2/path14 つのレベルが折りたたまれたことを示します。

# define the awk script using heredoc notation for easy modification
MYPSDIR_AWK=$(cat << 'EOF'
BEGIN { FS = OFS = "/" }
{ 
   sub(ENVIRON["HOME"], "~");
   if (length($0) > 16 && NF > 4)
      print $1,$2,".." NF-4 "..",$(NF-1),$NF
   else
      print $0
}
EOF
)

# my replacement for \w prompt expansion
export MYPSDIR='$(echo -n "$PWD" | awk "$MYPSDIR_AWK")'

# the fancy colorized prompt: [0 user@host ~]$
# return code is in green, user@host is in bold/white
export PS1='[\[\033[1;32m\]$?\[\033[0;0m\] \[\033[0;1m\]\u@\h\[\033[0;0m\] $(eval "echo ${MYPSDIR}")]$ '

# set x/ssh window title as well
export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"'

実際の動作は次のとおりです。緑の 0 は、最後のコマンドのリターン コードです。

ここに画像の説明を入力

于 2013-03-05T21:56:26.670 に答える
5
echo -n $PWD | sed -re "s|(~?/[^/]*/).*(.{$pwd_length})|\1...\2|"

-r は利便性のためだけに使用し、括弧の前のバックスラッシュと "|" を省略できます。コマンド内でスラッシュを使用したいので、便利な区切り文字としても使用できます。あなたの家も ~ と表示されていると思いますので、~/foo/bar/baz/ は ~/foo/.../baz で終わり、/foo/bar/baz/ は /foo/.../baz となるはずです。 /。

したがって、オプションの ~ を取り、その後にスラッシュ、名前、スラッシュを \1、次に何か、残りを \2 として使用します。

于 2011-04-16T15:45:52.960 に答える
1

を使用した bash-builtin ソリューションとは別に、他のほとんどの回答よりも少し簡単ですが、現在のディレクトリの最後の 16 文字のみを提供するPROMPT_DIRTRIMを試してみることをお勧めします。$(pwd | tail -c16)もちろん、16 を任意の数に置き換えます。

于 2015-03-31T08:49:58.660 に答える
0

以前のソリューションとそれほど違いはありません。ただし、もう少し読みやすく/編集しやすいかもしれません。ただし、フォルダー名の境界に対する解決策はなく、プロンプトの長さにのみ焦点を当てています。

### SET MY PROMPT ###
if [ -n "$PS1" ]; then
    # A temporary variable to contain our prompt command
    NEW_PROMPT_COMMAND='
        pwd_short=${PWD/#$HOME/\~};
        if [ ${#pwd_short} -gt 53 ]; then
            TRIMMED_PWD=${pwd_short: 0: 25}...${pwd_short: -25}
        else
            TRIMMED_PWD=${pwd_short}
        fi
    '

    # If there's an existing prompt command, let's not 
    # clobber it
    if [ -n "$PROMPT_COMMAND" ]; then
        PROMPT_COMMAND="$PROMPT_COMMAND;$NEW_PROMPT_COMMAND"
    else
        PROMPT_COMMAND="$NEW_PROMPT_COMMAND"
    fi

    # We're done with our temporary variable
    unset NEW_PROMPT_COMMAND

    # Set PS1 with our new variable
    # \h - hostname, \u - username
    PS1='\u@\h: $TRIMMED_PWD\$ '
fi

.bashrc ファイルに追加されます。プロンプトのすべての部分が適切に更新されます。ホームディレクトリにいる場合、最初の部分は短縮されています。 例:

user@computer: ~/misc/projs/solardrivers...src/com/mycompany/handles$

于 2015-07-03T05:37:21.497 に答える
0

なぜ使用しないの${string:position:length}ですか?${string:-$max_chars}文字列の最後を持つことができ${max_chars}ます。

負の値に注意してください

于 2015-06-06T19:41:39.857 に答える
0

https://github.com/chrissound/SodiumSierraStrawberry

次のようにパスを切り詰めることができます。

送信元: /home/sodium/Projects/Personal/Sierra/Super/Long/Path/HolyAvacado

宛先: »Projects/Sie…/Sup…/Lon…/Pat…/HolyAvacado/

于 2019-02-24T16:32:28.647 に答える
0

Raychiの答えは、Mac / Catalinaでうまく機能します。

対応するセクションを「2 つの深さ」の冒頭にわずかに変更しました。

if (length($0) > 16 && NF > 5)
   print $1,$2,$3,".." NF-5 "..",$(NF-1),$NF

結果は次のようになります。

/Volumes/Work/..3../Python/Tutorials

私の.bashrcファイルの自己完結型のコピー&ペーストソリューションとしての関連部分は次のとおりです。

MYPSDIR_AWK=$(cat << 'EOF'
BEGIN { FS = OFS = "/" }
{
   sub(ENVIRON["HOME"], "~");
   if (length($0) > 16 && NF > 5)
      print $1,$2,$3,".." NF-5 "..",$(NF-1),$NF
   else
      print $0
}
EOF
)

export MYPSDIR='$(echo -n "$PWD" | awk "$MYPSDIR_AWK")'

上記には、Raychi のカラー化スキームが含まれていないことに注意してください。必要に応じて別途追加してください。

于 2021-02-02T05:39:23.610 に答える