ターミナルコマンドプロンプトの作業ディレクトリをトリミングします。


39

深いフォルダー構造でターミナルを使用する場合、プロンプトがほとんどの行を占めることがあります。作業ディレクトリをトリミングする方法はありますか?できるとわかっている

PS1="\W >"

完全なパスではなく現在のディレクトリのみを印刷しますが、次のような方法があります:

/home/smauel/de...ther/folder >

回答:


30

目的のトリミングロジックを実装する小さなPythonスクリプトを作成します。

例: ~/.short.pwd.py

import os
from socket import gethostname
hostname = gethostname()
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)
if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '[%s@%s:%s] ' % (username, hostname, pwd)

次に、ターミナルからテストします。

export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

結果に問題がなければ、コマンドをコマンドに追加します~/.bashrc


明らかな質問をするのではなく、コマンドをどのように正確に追加します~/.bashrcか?ファイルの最後にその最後の行を貼り付けるだけでしょうか?
フローティング

1
@FloatingRock正しい。それを.bashrcファイルに追加するだけです。
プレフィックス

これは素晴らしい!Pythonプログラムを編集すると、自動的に更新されます:sweet!
N3sh

クール!すぐにこれを盗みました。
フェディ

その最後の印刷を更新して... print(...)に変更して、この作業をPython 3でもほぼそのままにして、素晴らしいヒント、共有してくれてありがとう!!
ショーン

69

bash4を使用している場合(Ubuntu 9.10以降にはbash4があります)、最も簡単なオプションはPROMPT_DIRTRIM変数を設定することです。例えば:

PROMPT_DIRTRIM=2

JoãoPintoの例に似たもの(古いbashバージョンで動作し、パスコンポーネントが30文字より長くならないようにします)の場合、次のようなことができます。

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4
PROMPT_DIRTRIMのドキュメントはここで見つけることができます:gnu.org/software/bash/manual/html_node/Bash-Variables.html
ベン・アモス

11

この問題を回避する別の方法は、PS1に改行を含めることです。これにより、作業ディレクトリと実際のプロンプトが別々の行に表示されます。次に例を示します。

PS1="\w\n>"

thiisと同様に、PS1プロンプトを変更せず、コマンドを\で開始してEnterを押すだけです。これにより、コマンドはPS2プロンプトで次の行から開始されます。通常は> ...(提案を見るまで考えていませんでした:)
Peter.O

4

これをあなたの一番下に追加します ~/.bashrc

split_pwd() {
        # Only show ellipses for directory trees -gt 3
        # Otherwise use the default pwd as the current \w replacement
        if [ $(pwd | grep -o '/' | wc -l) -gt 3 ]; then
                pwd | cut -d'/' -f1-3 | xargs -I{} echo {}"/../${PWD##*/}"
        else
                pwd
        fi
}


export PS1="\$(split_pwd) > "

確かにこれはおそらくよりクリーンかもしれませんが、私はそれにクラックを取得したかったです。

3層以上の深さのディレクトリに期待される出力。

/home/chris/../Node Projects >

デスクトップからのディレクトリおよびその逆の期待される出力。

/home/chris/Desktop > 
/home/chris >  
/home

綺麗な!$ HOMEを "〜/"に変換し、$ PWDがホームディレクトリの下にある場合、それを '長さ'の一部としてカウントしないことについて、いくつかのスマートを追加する必要があります。
マイケルバー

1

@joão-pintoの優れた答えへのこの小さな追加は、workonコマンドを実行するときに仮想環境名に追加されます。

import os
from platform import node
hostname = node().split('.')[0]
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

# check for the virtualenv
ve = os.getenv('VIRTUAL_ENV')

if ve:
    venv = '(`basename \"$VIRTUAL_ENV\"`)'
else:
    venv = ''

if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '%s[%s@%s:%s] ' % (venv, username, hostname, pwd)

これは絶対に不可欠です!お持ちでない場合は、Python仮想環境が機能していないと思われます。このため、恥ずかしげなくこれを使用して(色で...)私のアイデアに取り入れています。
マイクげっ歯類

1

Cris Sullivanの回答に基づき~ますが、ホームフォルダーは保持します

get_bash_w() {
  # Returns the same working directory that the \W bash prompt command
  echo $(pwd | sed 's@'"$HOME"'@~@')
}

split_pwd() {
  # Split pwd into the first element, elipsis (...) and the last subfolder
  # /usr/local/share/doc --> /usr/.../doc
  # ~/project/folder/subfolder --> ~/project/../subfolder
  split=2
  W=$(get_bash_w)
  if [ $(echo $W | grep -o '/' | wc -l) -gt $split ]; then
    echo $W | cut -d'/' -f1-$split | xargs -I{} echo {}"/../${W##*/}"
  else
    echo $W
  fi
}

export PS1="\$(split_pwd) > "

ここでPS1をエクスポートする必要はありませんか?素晴らしく見える。
クリスサリバン

はい、回答で詳しく説明したとおり、PS1をエクスポートする必要があります。作業ディレクトリを追加します:-)
Manuel


0

このプロンプトは、現在の行を除くすべての名前を短縮します。

user:/h/t/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

PS1='\u:$$(eval "sps")/\W\$ '

0

わずかに更新して(Python3の場合)、選択した回答強化して、BASHプロンプトに従ってプロンプトに色を追加します(とにかくLinux Mint 18.3で):

#! /usr/bin/python3

import os, getpass
from socket import gethostname

username = getpass.getuser()
hostname = gethostname()
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

if len(pwd) > 40:
    # first 10 chars+last 30 chars
    pwd = pwd[:10] + '...' + pwd[-30:] 

# Virtual environment being used? Essential not to omit!
ve = os.getenv('VIRTUAL_ENV')
venv = '(`basename \"$VIRTUAL_ENV\"`)' if ve else ''

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (venv, username, hostname, pwd) )

BASHターミナルのカラーコードの詳細はこちら。ターミナルが自動的に使用する色を見つける方法はおそらくありますが、それが何であるかはわかりません。

シェバン行ではexport、.bashrcに含める行は次のようになります。

export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file

NB1これらの「\ e」エスケープコードは、常に「\ [... \]」で囲む必要があります。そうしないと、改行が完全に台無しになります。

NB2を使用すると、いつでもフルパスを取得できます

... $ pwd 

もちろん...

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