Làm thế nào tôi có thể hiển thị đường dẫn tuyệt đối trong dấu nhắc bash?


50

Tôi hiện đang có bash của mình PS1được đặt thành một cái gì đó như thế này:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\w\n\$ "

Làm thế nào tôi có thể làm cho nó hiển thị đường dẫn tuyệt đối thay vì đường dẫn tương đối (ví dụ /home/dave/dirthay vì ~/dir)?


1
/home/dave/dir~/dirlà cả hai đường dẫn tuyệt đối, cái thứ hai sử dụng tên viết tắt cho thư mục chính của bạn. Đường dẫn tương đối là đường dẫn có liên quan đến thư mục hiện tại của bạn (ví dụ ../dir) thay vì bắt đầu từ root ( /).
Doug Harris

3
ps Sử dụng màu sắc đẹp để chỉ trạng thái thoát của lệnh trước đó. Có lẽ là lần đầu tiên sử dụng màu sắc trong một dấu nhắc mà tôi thích.
Doug Harris

@Doug Harris: Cảm ơn đã sửa chữa. Tôi cũng thích màu này. Đừng nhớ nơi tôi lần đầu tiên nhìn thấy nó (có lẽ trong một số bài SU trước đây?)
David B

\u@\H[\w]:~\$làmuser@host[~/path]:~$
JREAM

Câu trả lời:


49

Chỉ cần thay thế \wbằng \$PWD:

PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\$PWD\n\$ "

Dù sao, nếu bạn để ý một mẹo nhỏ, tôi sẽ viết một cái gì đó như:

PS1='\[`[ $? = 0 ] && X=2 || X=1; tput setaf $X`\]\h\[`tput sgr0`\]:$PWD\n\$ '

4
Tôi cũng nghĩ về điều này, nhưng $PWDđược đánh giá tại thời điểm chuyển nhượng PS1chứ không phải trên mỗi cuộc gọi. Tuy nhiên , nếu bạn thoát khỏi ký hiệu đô la, nó sẽ hoạt động - \$PWD. Với điều này, ký hiệu đô la là ký hiệu đô la tại thời điểm chuyển nhượng và việc đánh giá biến xảy ra trên mỗi dấu nhắc. +1 cho bạn.
Doug Harris

Phải, bỏ lỡ điều đó \, tôi thường làm việc với các trích dẫn đơn nếu có thể. Cảm ơn.
cYrus

+1 Cảm ơn! bạn có thể vui lòng giải thích điều kỳ diệu trong dòng bash đẹp của bạn ('mẹo') không?
David B

Chắc chắn rồi. Tôi đã sử dụng tput (xem man tput để biết thêm thông tin) để thay đổi màu sắc thay vì viết trực tiếp các ký tự điều khiển, để dễ đọc và tính di động (?). Ngoài ra tôi loại bỏ dấu ngoặc kép và dấu gạch chéo ngược bằng cách sử dụng dấu ngoặc đơn. Cuối cùng bằng cách sử dụng một biến tôi đã tránh được một số dư thừa.
cYrus


0

trong ps1 của bash; -W nên tương đối, và -w tuyệt đối, vậy ở phần trên bạn đã có tuyệt đối chưa?!

http://wiki.archlinux.org/index.php/Color_Bash_Prompt


3
Tôi nghĩ bạn đang nhầm lẫn tuyệt đối | tương đối với đầy đủ | current_dir. Wchỉ hiển thị tên thư mục hiện tại, whiển thị đường dẫn đầy đủ, nhưng vẫn sử dụng các đường dẫn tương đối.
David B

là thuật ngữ trong url, không phải của tôi :)
Sirex

0

Humm ~ / dir là một đường dẫn tuyệt đối nhưng sử dụng "phím tắt". Chẳng hạn, nếu bạn thực hiện cd /usr/locallời nhắc của mình thì rất có thể sẽ hiển thị đường dẫn đầy đủ của / usr / local. Vì vậy, dù sao, bạn đã có một đường dẫn đầy đủ :-)

Nhưng có lẽ câu hỏi chính xác của bạn là làm thế nào để hiển thị đường dẫn đầy đủ mà không cần bất kỳ phím tắt nào như ~?

Tuy nhiên, tôi không biết câu trả lời cho câu hỏi đó và nhìn vào người đàn ông, nó dường như có một (ít nhất là tài liệu).


0

Chạy pwdthay vì sử dụng \W.

Phiên bản đơn giản:

export PS1="\`pwd\` $ "

Sử dụng mã này trong mã của bạn:

export PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi\`:\`pwd\`\n\$ "

1
điểm phụ: theo hướng dẫn kiểu bash của google, thích $ (pwd) hơn backticks vì backticks yêu cầu thoát khi lồng và $ () không.
funroll
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.