Viết tắt thư mục hiện tại trong dấu nhắc shell?


23

vim có một tính năng thực sự hay mà nó sử dụng trong đường dẫn của nó khi chúng hơi dài:

nhập mô tả hình ảnh ở đây

Nó viết tắt đường dẫn đến tài liệu trong tab ở trên cùng. Có cách nào để làm một cái gì đó tương tự như vậy để dấu nhắc bash của tôi không giống như thế này:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Vì vậy, những gì bạn muốn là rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Lý tưởng nhất, sử dụng một số ngưỡng cho chiều dài nhắc tối đa?
nicerobot

Chính xác, đó là những gì tôi đang tìm kiếm.
Naftuli Kay

Ok, tôi đã cung cấp câu trả lời của tôi.
nicerobot

Câu trả lời:


14

Hãy thử điều này :

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

hoặc, bash tinh khiết:

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

sau đó

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

sản xuất (chú ý ~cho ${HOME}):

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

Tôi đã cải thiện câu trả lời của mình nhờ @ enzotib's


1
Bạn có thể cung cấp một ví dụ về những gì nó sẽ trông giống như một dấu nhắc, cho hậu thế?
Naftuli Kay

(0) Liên kết github của bạn bị hỏng. (1) Bạn có thể muốn xem xét kỹ hơn về bài kiểm tra $PWD~. Hiện nay, nếu HOME/home/edPWD/home/edwina, bạn sẽ có ~winatrong phiên bản Perl và ~/inatrong phiên bản vỏ. (2) Mã shell của bạn bị nghẹt nếu thư mục hiện tại chứa bất kỳ ký tự đại diện (nghĩa là mở rộng tên đường dẫn); ví dụ: PWD= /abc/*/def. Bạn có thể khắc phục điều này bằng cách thêm set -o noglobhoặc set -f. Tiết (Cont'd)
G-Man nói 'Phục hồi Monica'

(Tiếp theo) Nhiều (3) Bạn không cần quá nhiều niềng răng. Trong lệnh Perl, $HOME(nằm trong dấu ngoặc kép) và $PWDđủ tốt. Trong lệnh shell, ba tài liệu tham khảo biến vỏ cuối cùng cũng tốt, nhưng ba đầu tiên có thể "${PWD#$HOME}", "$PWD""$p". (4) Xem thêm câu trả lời của mbentley và nhận xét của tôi trên đó.
G-Man nói 'Phục hồi Monica'

15

Tương tự như câu trả lời @nicerobot, nhưng có phần ngắn hơn:

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

Điều này sẽ hiển thị đầu ra ví dụ sau:

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

13

Tôi thích PROMPT_DIRTRIMtrong bash ...

export PROMPT_DIRTRIM=2

sẽ thay đổi lời nhắc mẫu của bạn thành ...

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

Nó làm việc cho tôi.


Không làm những gì anh ấy yêu cầu nhưng cảm ơn vì đã thông báo cho tôi về tính năng này.
nicerobot

3
@nicerobot Vâng, bạn đã có câu trả lời thực sự. :) Tôi biết nó không đưa ra từ viết tắt mà anh ấy yêu cầu, nhưng thường khi chúng tôi thấy các tùy chọn đơn giản, kỳ vọng của chúng tôi thay đổi. Ngoài ra, nó là tiêu chuẩn, và như vậy tôi cảm thấy nó xứng đáng được đề cập.
BentFX

1
Tôi cảm thấy rằng một trong những chức năng của SE là không chỉ cung cấp câu trả lời hoàn hảo cho câu hỏi mà còn cung cấp các tùy chọn khác cho OP và những người khác tìm thấy câu hỏi thông qua tìm kiếm. Lưu ý bối cảnh câu trả lời tôi cung cấp "Tôi thích ... làm việc cho tôi." Vẫn còn một số người tin rằng nó xứng đáng được bỏ phiếu.
BentFX

Tôi có xu hướng thấy câu trả lời bị bỏ phiếu mà không trả lời trực tiếp câu hỏi nhưng tôi đồng ý với bạn rằng việc cung cấp giải pháp thay thế có thể là câu trả lời hoặc câu trả lời hợp lệ .
nicerobot

Câu trả lời của BentFX không trả lời toàn bộ câu hỏi của OP nhưng chính xác là chủ đề Thư mục hiện tại được viết tắt trong dấu nhắc shell? có lẽ đối với hầu hết khách truy cập của chủ đề này chính xác những gì họ đang tìm kiếm.
TNT

4

Thêm vào câu trả lời của enzotib , đoạn trích sau sẽ:

  1. Chuyển đổi /Path/To/Your/Home/thành ~/(vì vậy một đường dẫn sẽ ~/a/b/cthay thế /P/T/Y/H/a/b/c)
  2. Sử dụng chữ cái đầu tiên của 'tệp chấm' thay vì chỉ hiển thị dấu chấm ( /a/./c/dsẽ trở thành /a/.b/c/d):

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

Hãy chắc chắn rằng bạn sử dụng dấu ngoặc đơn hoặc bash sẽ mở rộng sớm.


3

Định dạng để sử dụng trong của bạn PS1\W(xem PROMPTINGphần trong bashtrang man).

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

Và bạn có thể muốn đọc các tùy chọn khác ở đó, bạn có thể thực hiện một số nội dung thú vị với dòng lệnh của mình.


2
Tôi nghĩ rằng \ W không làm gì cả.
nicerobot

1
@nicerobot Nó không đưa ra chữ cái đầu tiên của mọi thành phần của đường dẫn, nhưng nó đưa ra thư mục làm việc hiện tại theo cách ngắn hơn. Tôi khá chắc chắn rằng không thể viết tắt thư mục theo cách đó mà không sử dụng một số tập lệnh khá xấu được thực hiện mỗi lời nhắc. Chúng ta sẽ thấy những gì anh ấy nói về điều này.
Kevin

1

Tôi thích kết quả đầu ra từ ví dụ của nicerobot nhưng tôi đã tìm thấy một vấn đề. Tôi có một thư mục có dấu gạch nối trong đó A-Evà nó được xem -Enhư là một đối số printfkhi nó là thư mục làm việc hiện tại của tôi. Để khắc phục điều này, tôi đã thêm vào dấu ngoặc kép --cuối cùng printfvà thêm vào xung quanh đầu ra trong trường hợp không có gì để xuất:

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

(1) Nắm bắt tốt về vấn đề tên thư mục chứa -ký tự thứ hai. Mặc dù đúng --là giải pháp chung cho vấn đề tranh luận bắt đầu bằng -một phương pháp tốt hơn printfđể nói printf "%s" "${q:1}", vì điều này cũng bảo vệ chống lại các đối số có chứa %. (Ví dụ: thử PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Xem thêm nhận xét của tôi về câu trả lời của nicerobot.
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.