terminal komut istemi çalışma dizinini kırpın


39

Terminali derin bir klasör yapısında kullanırken bazen bilgi istemi satırın çoğunu alabilir. Çalışma dizinini kesebileceğim bir yol var mı? Yapabileceğimi biliyorum

PS1="\W >"

sadece geçerli dizini ve tam yolu yazdırmak için değil, bunun gibi bir yöntemin var:

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

Yanıtlar:


30

İstediğiniz kırpma mantığını uygulayan küçük bir python betiği oluşturun.

Örnek: ~/.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)

Şimdi bir terminalden sınayın:

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

Eğer sonuç ile tamam iseniz sadece komutunu kendinize ekleyin ~/.bashrc.


Açıkça sormamak değil, ama komutu tam olarak nasıl ekleriz ~/.bashrc? Dosyanın en altındaki son satırı yapıştırmak mı olurdu?
FloatingRock

1
@ FloatingRock doğru. Basitçe .bashrc dosyasına ekleyin.
Önek

Bu harika! Python programını düzenlerseniz, otomatik olarak güncellenir: tatlı!
N3sh

güzel! hemen bunu çaldı.
ferdy

Bu son baskıyı güncelleyin ... yazdırmak için (...) bu işi hemen hemen python 3 için olduğu gibi yapın, harika bir ipucu, paylaşım için teşekkürler !!
Sean

69

Bash4 kullanıyorsanız (Ubuntu 9.10 ve daha yenisi bash4'e sahipse), en kolay seçenek PROMPT_DIRTRIM değişkenini ayarlamaktır. Örneğin:

PROMPT_DIRTRIM=2

João Pinto'nın örneğine benzer bir şey için, (eski bash sürümlerinde çalışacak ve path bileşeninin hiçbir zaman 30 karakterden uzun olmamasını sağlar), şöyle bir şey yapabilirsiniz:

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

4
PROMPT_DIRTRIM belgeleri burada bulunabilir: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos

11

Bu sorunun bir başka yolu PS1'e bir satır sonu eklemektir; böylece çalışma dizini ve gerçek bilgi istemi ayrı satırlarda görünecektir, örneğin:

PS1="\w\n>"

Buna benzer şekilde, PS1 isteminizi değiştirmek değil, sadece komutunuzu \ ile başlatmak ve Enter tuşuna basmaktır . Komut genellikle PS2 istemi ile sonraki satıra, ta başlaması Bu kuvvetler > ... (Teklifinizi :) görene kadar bunu düşünmemiştim
Peter.O

4

Bunu, altına ekle ~/.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) > "

Kuşkusuz bu muhtemelen daha temiz olabilirdi, ama ben onunla bir çatlak almak istedim.

Üç katmandan fazla derinliğe sahip dizinler için beklenen çıktı.

/home/chris/../Node Projects >

Desktop ve geri gelen dizinler için beklenen çıktı.

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

Güzel! Sadece $ HOME'u "~ /" ye dönüştürmekle ilgili biraz akıllı eklemeliyim ve eğer $ PWD ana dizinin altındaysa, 'uzunluğun' bir parçası olarak saymayacağım.
Michael Burr

1

@ João-pinto'nun mükemmel yanıtına verilen bu küçük ekleme , workonkomutu çalıştırdığınızda sanal ortam adına eklenir .

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)

Ah, güzel fikir ... belki de boyama kodlarımla birleştirebilirsin?
Mike kemirgen

1

Cris Sullivan'ın cevabına dayanarak , ancak ~ana klasörü için tutmak

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

Hala PS1'i burada dışa aktarmanıza gerek yok mu? Harika görünüyor.
Chris Sullivan

Evet, cevabınızdaki gibi, PS1'i yine de dışa aktarmanız gerekiyor. Sadece çalışma dizinini ekliyorum :-)
Manuel


0

bu bilgi istemi, şu anki satır dışındaki tüm isimleri kısaltır:

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

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

0

Sadece biraz güncellemek (Python3 için) ve BASH komut istemine göre bilgi istemine renk eklemek için seçilen cevabı geliştirin (yine de Linux Mint 18.3'te):

#! /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:] 

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

Buradaki BASH Terminalinde renk kodları hakkında daha fazla bilgi . Terminal'in otomatik olarak hangi renkleri kullandığını bulmanın bir yolu olabilir, ama ne olabileceğine dair hiçbir fikrim yok.

Shebang hattıyla .bashrc'ye exportdahil edilme çizgisi şöyle olur:

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

NB1 bu "\ e" çıkış kodları daima "\ [... \]" içine alınmalıdır, aksi takdirde satır dönüşleri tamamen karışır.

NB2 herhangi bir zamanda tam yolunu almak için sadece git

... $ pwd 

tabii ki...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.