memotong direktori kerja prompt perintah terminal

39

Saat menggunakan terminal dalam struktur folder yang dalam, terkadang prompt dapat mengambil sebagian besar baris. Apakah ada cara di mana saya dapat memangkas direktori kerja? Saya tahu saya bisa melakukannya

PS1="\W >"

untuk hanya mencetak direktori saat ini dan bukan path lengkap, tetapi apakah ada cara untuk memiliki sesuatu seperti:

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

Jawaban:

30

Buat skrip python kecil yang mengimplementasikan logika pemangkasan yang diinginkan.

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

Sekarang ujilah, dari terminal:

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

Jika Anda setuju dengan hasilnya, tambahkan saja perintah ke ~/.bashrc.

João Pinto
sumber
Bukan untuk menanyakan yang sudah jelas, tetapi bagaimana tepatnya kita menambahkan perintah ke ~/.bashrc? Apakah itu hanya akan menempelkan baris terakhir di bagian bawah file?
FloatingRock
1
@ FloatingRock benar. Cukup tambahkan ke file .bashrc.
Awalan
Ini bagus! Jika Anda mengedit program python, program ini secara otomatis memperbarui: sweet!
N3sh
keren! segera mencuri ini.
Ferdy
Perbarui cetakan terakhir itu ... untuk mencetak (...) untuk mendapatkan pekerjaan ini hampir seperti apa adanya untuk python 3 juga, tip yang bagus, terima kasih telah berbagi !!
Sean
69

Jika Anda menggunakan bash4 (Ubuntu 9.10 dan yang lebih baru memiliki bash4), opsi termudah adalah dengan hanya mengatur variabel PROMPT_DIRTRIM. misalnya:

PROMPT_DIRTRIM=2

Untuk yang mirip dengan contoh João Pinto, (yang akan bekerja di versi bash yang lebih lama dan memastikan bahwa komponen path tidak pernah lebih dari 30 karakter), Anda dapat melakukan sesuatu seperti ini:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '
geirha
sumber
4
Dokumentasi untuk PROMPT_DIRTRIM dapat ditemukan di sini: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos
11

Cara lain untuk mengatasi masalah tersebut adalah dengan memasukkan baris ke PS1, sehingga direktori kerja dan prompt aktual muncul pada baris yang terpisah, misalnya:

PS1="\w\n>"
ak2
sumber
Mirip dengan ini, adalah tidak mengubah prompt PS1 Anda, tetapi hanya memulai perintah Anda dengan \ dan tekan Enter . Ini memaksa perintah untuk memulai pada baris berikutnya dengan prompt PS2, yang biasanya > ... (Saya belum memikirkannya sampai saya melihat saran Anda :)
Peter.O
4

Tambahkan ini ke bagian bawah Anda ~/.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) > "

Memang ini mungkin bisa lebih bersih, tetapi saya ingin melakukannya.

Output yang diharapkan untuk direktori lebih dari tiga lapisan.

/home/chris/../Node Projects >

Output yang diharapkan untuk direktori dari Desktop dan kembali.

/home/chris/Desktop > 
/home/chris >  
/home
Chris Sullivan
sumber
Indah! Saya hanya perlu menambahkan beberapa kecerdasan tentang mengubah $ HOME menjadi "~ /" dan tidak menghitungnya sebagai bagian dari 'panjang' jika $ PWD berada di bawah direktori home.
Michael Burr
1

Tambahan kecil untuk jawaban yang sangat bagus @ joão-pinto ini menambahkan nama lingkungan virtual saat Anda menjalankan workonperintah.

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)
katahdin
sumber
Ini sangat penting! Jika Anda tidak memilikinya, Anda akan menganggap lingkungan virtual Python Anda tidak berfungsi saat itu ... karena alasan ini saya tanpa malu menggunakan ini untuk memasukkan ke dalam ide saya (dengan warna ...).
mike rodent
1

Berdasarkan jawaban Cris Sullivan , tetapi menyimpan ~untuk folder rumah

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) > "
Manuel
sumber
Apakah Anda masih perlu mengekspor PS1 di sini ?? Tampak hebat.
Chris Sullivan
Ya, Anda masih perlu mengekspor PS1, karena Anda merinci jawaban Anda. Saya baru saja menambahkan direktori kerja :-)
Manuel
0

Saya paling suka yang ini, PS1="[\W]\\$ "

Medya
sumber
OP menyebutkan mereka tidak tertarik dengan hal itu.
wjandrea
0

prompt ini mempersingkat semua nama kecuali baris saat ini:

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

PS1='\u:$$(eval "sps")/\W\$ '
Travis S
sumber
0

Untuk memperbarui sedikit (untuk Python3) dan tingkatkan jawaban yang dipilih untuk menambahkan warna ke prompt sesuai permintaan BASH (toh 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) )

Lebih lanjut tentang kode warna di Terminal BASH di sini . Mungkin ada beberapa cara untuk mengetahui warna apa yang digunakan Terminal Anda secara otomatis, tetapi saya belum tahu apa itu.

Dengan garis shebang garis exportuntuk dimasukkan dalam .bashrc kemudian menjadi:

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

NB1 kode "" e "escape ini harus selalu dimasukkan dalam" \ [... \] ", jika tidak, line-return akan benar-benar kacau.

NB2 untuk mendapatkan path lengkap Anda kapan saja pergi

... $ pwd 

tentu saja...

mike rodent
sumber