Tại sao việc đặt dấu nhắc bash (PS1) theo cách thủ công khiến root có $ thay vì #?


11

Tôi đang dùng CentOS 6.4. Theo mặc định, dấu nhắc của người dùng root có #ký hiệu, nghĩa là nó trông giống như vậy [root@myserver ~]# .

echo $PS1in ra [\u@\h \W]\$; nhưng nếu tôi làm PS1="[\u@\h \W]\$"(không nên thay đổi bất cứ điều gì, afaics), tôi sẽ kết thúc bằng một dấu nhắc giống như thế này : [root@myserver ~]$.

Tại sao khi tôi cố gắng tự thiết lập nó (cuối cùng tôi muốn thay đổi nó thành một cái gì đó hữu ích hơn), nó có diễn giải theo $nghĩa đen không? Gần như mọi trang tôi có thể tìm thấy (ví dụ: Cách: Thay đổi / Cài đặt dấu nhắc tùy chỉnh bash (PS1) ) nói rằng điều đó \$sẽ dẫn đến một #người dùng root.


PS1=[\u@\h \W]\$trả lại -bash: W]$: command not found.
choroba

@choroba oops, xin lỗi, đã bỏ lỡ các trích dẫn kép, nó nên có PS1="[\u@\h \W]\$".
thoát y

Câu trả lời:


14

Trong câu hỏi của bạn, bạn ngụ ý rằng bạn không trích dẫn dòng nào cả; điều đó rõ ràng sai, bởi vì sau đó khoảng trắng sẽ phân tách phép gán đối số "PS1 = [\ u @ \ h" khỏi lệnh "\ W] \ $". Hãy nhận ra rằng mọi nhân vật đều quan trọng.

Dù sao, những gì bạn có thể đang làm là sử dụng dấu ngoặc kép (") chứ không phải là dấu ngoặc đơn ('). Chúng hoạt động rất khác nhau khi nói đến trình diễn diễn giải những gì bạn đã nhập. Với dấu ngoặc kép, nó sẽ cố gắng làm những điều thông minh với Các chuỗi dấu gạch chéo ngược / một số ký tự. Đối với nhiệm vụ này, vì không có gì đặc biệt về \ u, \ h và \ W, chúng không bị ảnh hưởng; dấu ngoặc vuông có thể có ý nghĩa đặc biệt ở nhiều nơi, nhưng không phải trong trường hợp này, vì vậy chúng cũng được đặt đúng chỗ, nhưng vì $có nhiều ý nghĩa khác nhau, tất cả đều đặc biệt, nên \$trình tự được hiểu là "bỏ qua tính đặc biệt của ký hiệu đô la và để nó ở đó", và chuỗi đó được thay thế bằng một ký hiệu đô la không phân tích cú pháp nữa. Kết quả của tất cả những điều đó được gán choPS1và vì có ký hiệu đô la theo nghĩa đen và không phải là \$chuỗi ma thuật khi trình bao xây dựng dấu nhắc thực tế, bạn chỉ nhận được ký hiệu đô la chứ không phải ký tự phụ thuộc vào người dùng hiệu quả. Việc phân tích cú pháp thực tế phức tạp hơn một chút, nhưng đó là ý chính của ví dụ cụ thể này.

Những gì bạn đã nhập: PS1="[\u@\h \W]\$ "
Những gì vỏ được gán: PS1 <- "[\u@\h \W]$ "
Những gì bạn muốn: PS1 <- "[\u@\h \W]\$ "
Những gì bạn nên gõ:PS1='[\u@\h \W]\$ '

Những gì bạn nên làm tiếp theo: Đọc một cái gì đó như hướng dẫn này để tìm hiểu thêm về trích dẫn shell.


1
Đúng, bạn đã phát hiện ra, tôi đã sử dụng dấu ngoặc kép (xin lỗi vì đã bỏ lỡ chúng từ câu hỏi ban đầu), cảm ơn vì đã chỉ ra lỗi sai của tôi.
thoát y

Nếu bạn đã từng làm nhu cầu sử dụng hai dấu ngoặc kép đối với một số lý do, sử dụng PS1="...\\\$"để đảm bảo rằng các cặp đen \$được lưu trữ trong PS1các vỏ để giải thích sau.
chepner

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.