web-dev-qa-db-ja.com

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

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

PS1="\W >"

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

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

目的のトリミングロジックを実装する小さな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に追加するだけです。

29
João Pinto

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")]\$ '
68
geirha

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

PS1="\w\n>"
11
ak2

これを~/.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
3
Chris Sullivan

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) > "
1
Manuel

@joão-pintoの優れた answer へのこの小さな追加は、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)
0
katahdin

私はこれが一番好きです、PS1="[\W]\\$ "

0
Medya