Chuyển đổi định dạng của chuỗi dấu nhắc thiết bị đầu cuối gnome bằng lệnh?


9

Thiết bị đầu cuối của tôi có định dạng nhắc nhở mặc định như thế này:

tên người dùng @ boxname / path / to / current / thư mục $

Mã tạo ra nó trông như thế này: (nó cũng có một số định nghĩa màu)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

Nếu đường dẫn đến thư mục hiện tại quá dài, nó sẽ trở nên khó chịu khi làm việc với thiết bị đầu cuối vì bạn liên tục ngắt dòng. Trong những trường hợp như vậy, tôi thích một định dạng tạo ra một chuỗi ngắn hơn như thế này:

tên người dùng @ boxname current_dir_name $

Mã tạo ra nó sẽ trông như thế này (một lần nữa với màu sắc):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Có ai biết làm thế nào tôi có thể dễ dàng chuyển đổi định dạng của cửa sổ thiết bị đầu cuối hiện tại từ kiểu này sang kiểu khác chỉ bằng cách gõ chẳng hạn : prompttoggle?


6
Bạn có biết về tham số PROMPT_DIRTRIM của bash không?
Steeldo

@steel ấn chưa đến bây giờ. Chuyển đổi giữa PROMPT_DIRTRIM=0PROMPT_DIRTRIM=1có vẻ đơn giản hơn so với chuyển đổi giữa các giá trị khác nhau PS1và kết quả gần như giống nhau. Cảm ơn bạn về thông tin!
Rotareti

Sử dụng PROMPT_DIRTRIMmột cũng có thể thêm đối số cho lệnh. Nếu bạn vượt qua không có đối số bạn chuyển đổi giữa PROMPT_DIRTRIM=0PROMPT_DIRTRIM=1và nếu bạn vượt qua một số như một cuộc tranh cãi bạn thiết lập PROMPT_DIRTRIMvới nó. promptlensẽ là một tên thích hợp hơn cho lệnh sau đó.
Rotareti

Câu trả lời:


10

Lưu trữ cả hai PS1biến dài và ngắn của bạn dưới một tên khác nhau:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Đảm bảo đặt PS1thành một trong số chúng ban đầu:

PS1="$PS1long"

Sau đó, bạn có thể tạo một bí danh như thế này để chuyển đổi giữa hai giá trị PS1:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

Thêm tất cả bốn dòng vào ~/.bashrctệp của bạn sẽ tạo ra lệnh có sẵn trong các phiên Bash của bạn, đây là một lần nữa để sao chép dễ dàng hơn:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

7

Bạn có thể sử dụng một bashchức năng nhỏ :

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

Hàm trên khớp với nếu dòng $PS1chứa basename, nếu có, thì PS1không có basenameđược đặt nếu không thì hàm có basenameđược đặt.

Đặt chức năng của bạn ~/.bashrcđể có sẵn trong tất cả các phiên tương tác.

Thí dụ:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

5

Hoặc ... tạo hai hàm rất nhỏ và thêm vào cuối của bạn~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

cho một dấu nhắc rút ngắn, gõ promptshort, để quay lại đường dẫn đầy đủ, gõpromptlong

\WChỉ hiển thị thư mục làm việc hiện tại vì vậy $(basename ${PWD})là quá mức imho

Bạn có thể kết hợp thành một chức năng nhưng "dài" và "ngắn" là mô tả và cả hai đều có ít tổ hợp phím hơn so với "chuyển đổi";)

Thay vì thêm một dòng để ghi đè PS1, tôi thích điều chỉnh mã đặt nó (ví dụ: bỏ ghi chú force_color_prompt=yesvà chỉnh sửa dòng sau [ "$color_prompt" = yes ]; then)


3

Đây là một ~/.bashrcđịnh nghĩa hàm mà cá nhân tôi sử dụng để đặt lại / chuyển đổi lời nhắc của tôi từ dấu nhắc thông thường sang chỉ $. Điều chỉnh nó khi cần thiết để phù hợp với nhu cầu của bạn.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

1

Đây là một câu trả lời cho vấn đề của bạn (các thư mục dài phá vỡ dòng lệnh) và không cụ thể cho câu hỏi của bạn (cách thay đổi dấu nhắc lệnh khi đang di chuyển.)

Tôi đã giải quyết vấn đề này nhiều năm trước với lời nhắc này:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

Cái này làm gì

  1. xuất giá trị thoát của lệnh trước đó (điều này cực kỳ hữu ích)
  2. xuất ra người dùng và máy chủ hiện tại trong một màu
  3. xuất thư mục làm việc sang màu khác (điều chỉnh màu theo sở thích của bạn)
  4. xuất đô la và không gian trên một dòng mới , kết thúc các chuỗi màu trước khi ngắt dòng

Điều này cung cấp cho bạn tất cả không gian bạn cần cho lệnh của bạn, không dịch chuyển nó ngay khi bạn đang ở trong cấu trúc thư mục sâu, không xáo trộn dòng gõ bằng mã màu (đôi khi tránh các lỗi lạ xảy ra), trong khi vẫn cho bạn màu gợi ý về nơi đầu ra của một lệnh kết thúc và lệnh tiếp theo bắt đầu:

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

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.