Singkatan direktori saat ini di prompt shell?

23

vim memiliki fitur yang sangat bagus yang digunakan pada jalurnya ketika agak lama:

masukkan deskripsi gambar di sini

Ini menyingkat jalur ke dokumen di tab di bagian atas. Apakah ada cara untuk melakukan sesuatu yang mirip dengan ini sehingga bash prompt saya tidak terlihat seperti ini:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 
Naftuli Kay
sumber
2
Jadi, apa yang Anda inginkan rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idealnya, menggunakan beberapa ambang batas untuk panjang prompt maksimum?
nicerobot
Tepat, itulah yang saya cari.
Naftuli Kay
Ok, saya berikan jawaban saya.
nicerobot

Jawaban:

14

Coba ini :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

atau, bash murni:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

kemudian

PS1='\u@\h ${PS1X} $ '

menghasilkan (perhatikan ~untuk ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

Saya meningkatkan jawaban saya berkat @ enzotib

nicerobot
sumber
1
Bisakah Anda memberikan contoh bagaimana ini akan terlihat sebagai prompt, untuk anak cucu?
Naftuli Kay
(0) Tautan github Anda rusak. (1) Anda mungkin ingin melihat lebih dekat pada tes $PWD~. Saat ini, jika HOMEada /home/eddan PWDsedang /home/edwina, Anda mendapatkan ~winadalam versi Perl dan ~/inadalam versi shell. (2) Kode shell Anda tersedak jika direktori saat ini berisi karakter wildcard (mis., Ekspansi nama path); misalnya, PWD= /abc/*/def. Anda dapat memperbaikinya dengan menambahkan set -o noglobatau set -f. … (Lanjutan)
G-Man Mengatakan 'Reinstate Monica'
(Lanjutkan) ... (3) Anda tidak membutuhkan kawat gigi yang sangat banyak. Pada perintah Perl, $HOME(yang ada di dalam tanda kutip ganda) dan $PWDcukup baik. Dalam perintah shell, yang terakhir tiga referensi variabel shell baik-baik saja, tapi tiga pertama dapat "${PWD#$HOME}", "$PWD"dan "$p". (4) Lihat juga jawaban mbentley dan komentar saya di atasnya.
G-Man Mengatakan 'Reinstate Monica'
15

Mirip dengan jawaban @nicerobot, tetapi agak pendek:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Ini akan menampilkan output contoh berikut:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$
enzotib
sumber
13

Saya suka PROMPT_DIRTRIMdi bash ...

export PROMPT_DIRTRIM=2

akan mengubah prompt contoh Anda ke ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Ini bekerja untuk saya.

BentFX
sumber
Tidak melakukan apa yang dia minta tetapi terima kasih telah memberi tahu saya tentang fitur tersebut.
nicerobot
3
@nicerobot Ya, Anda punya jawaban yang sebenarnya. :) Saya tahu itu tidak memberikan singkatan yang dia minta, tetapi seringkali ketika kita melihat opsi sederhana harapan kita berubah. Juga, itu standar, dan karena itu saya merasa layak disebut.
BentFX
1
Saya merasa bahwa salah satu fungsi SE adalah untuk tidak hanya memberikan jawaban yang sempurna untuk pertanyaan, tetapi juga untuk memberikan opsi lain untuk OP dan orang lain yang menemukan pertanyaan melalui pencarian. Perhatikan konteks jawaban yang saya berikan, "Saya suka ... bekerja untuk saya." Masih ada yang percaya itu layak turun suara.
BentFX
Saya cenderung melihat jawaban turun sebagai voting yang tidak langsung menjawab pertanyaan, tetapi saya setuju dengan Anda bahwa memberikan alternatif dapat menjadi jawaban atau jawaban yang valid .
nicerobot
Jawaban BentFX tidak menjawab pertanyaan OP secara keseluruhan tetapi tepatnya subjek Singkatan direktori saat ini di shell prompt? yang mungkin untuk sebagian besar pengunjung topik ini persis apa yang mereka cari.
TNT
4

Menambahkan ke jawaban enzotib , cuplikan berikut akan:

  1. Konversikan /Path/To/Your/Home/ke ~/(jadi jalan akan menjadi ~/a/b/cbukan /P/T/Y/H/a/b/c)
  2. Gunakan huruf pertama dari 'file titik' alih-alih hanya menunjukkan titik ( /a/./c/dakan menjadi /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Pastikan Anda menggunakan tanda kutip tunggal atau bash akan mengembangkannya sebelum waktunya.

renlo
sumber
3

Format untuk digunakan PS1adalah Anda \W(lihat PROMPTINGbagian di bashhalaman manual).

PS1="\u@\h \W\$ "

Dan Anda mungkin ingin membaca opsi lain di sana, Anda dapat melakukan beberapa hal keren dengan baris perintah Anda.

Kevin
sumber
2
Saya pikir saya tidak melakukan apa pun yang dia minta.
nicerobot
1
@nicerobot Ini tidak memberikan inisial pertama dari setiap komponen path, tetapi memberikan direktori kerja saat ini dengan cara yang lebih pendek. Saya cukup yakin itu tidak mungkin untuk menyingkat direktori dengan cara itu tanpa menggunakan beberapa skrip agak jelek dieksekusi setiap prompt. Kita akan lihat apa yang dia katakan tentang ini.
Kevin
1

Saya suka output dari contoh nicerobot tetapi saya menemukan satu masalah. Saya memiliki direktori yang memiliki tanda hubung di dalamnya A-E,, dan itu dilihat -Esebagai argumen printfketika itu adalah direktori kerja saya saat ini. Untuk memperbaikinya, saya menambahkan tanda kutip --terakhir printfdan yang ditambahkan di sekitar keluaran jika tidak ada yang dihasilkan:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"
mbentley
sumber
(1) Bagus menangkap pada masalah nama direktori yang mengandung -sebagai karakter kedua. Meskipun benar itu --adalah solusi umum untuk masalah argumen yang dimulai dengan- , metode yang lebih baik printfadalah mengatakan printf "%s" "${q:1}", karena ini juga melindungi terhadap argumen yang mengandung %. (Misalnya, coba PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Lihat juga komentar saya tentang jawaban nicerobot.
G-Man Mengatakan 'Reinstate Monica'