ทำไมการตั้งค่าพรอมต์ bash (PS1) ด้วยตนเองทำให้รูทมี $ แทนที่จะเป็น #


11

ฉันใช้ CentOS 6.4 โดยค่าเริ่มต้นผู้ใช้รากของพรอมต์มีสัญลักษณ์คือมันมีลักษณะคล้าย#[root@myserver ~]# 

echo $PS1พิมพ์ออกมา[\u@\h \W]\$; แต่ถ้าผมทำPS1="[\u@\h \W]\$"(ซึ่งไม่ควรเปลี่ยนอะไร afaics) [root@myserver ~]$ผมจบลงด้วยพรอมต์ที่มีลักษณะเช่นนี้

ทำไมเมื่อฉันพยายามที่จะตั้งค่าตัวเอง (ในที่สุดฉันต้องการที่จะเปลี่ยนเป็นสิ่งที่มีประโยชน์มากขึ้น) มันตีความ$ตัวอักษร? เกือบทุกหน้าที่ฉันสามารถหาได้ (เช่นวิธี: เปลี่ยน / ตั้งค่า bash custom prompt (PS1) ) บอกว่า\$ควรส่งผล#ให้ผู้ใช้รูท


PS1=[\u@\h \W]\$-bash: W]$: command not foundผลตอบแทน
choroba

@choroba PS1="[\u@\h \W]\$"โอ๊ะขอโทษคิดถึงคำพูดสองออกก็ควรจะได้รับ
stripybadger

คำตอบ:


14

ในคำถามของคุณคุณหมายความว่าคุณไม่ได้อ้างบรรทัดเลย เห็นได้ชัดว่าผิดเพราะช่องว่างจะแยกการกำหนดอาร์กิวเมนต์ "PS1 = [\ u @ \ h" ออกจากคำสั่ง "\ W] \ $" โปรดตระหนักว่าตัวละครทุกตัวมีความสำคัญ

อย่างไรก็ตามสิ่งที่คุณอาจทำคือใช้เครื่องหมายคำพูดคู่ (") แทนที่จะเป็นคำเดียว (') พวกมันจะทำงานแตกต่างกันมากเมื่อมันมาถึงเชลล์ที่ตีความสิ่งที่คุณพิมพ์ด้วยอัญประกาศคู่มันจะพยายามทำสิ่งที่ฉลาดด้วย ลำดับของแบ็กสแลช / ตัวละครบางตัวสำหรับการมอบหมายนี้เนื่องจากไม่มีอะไรพิเศษเกี่ยวกับ \ u, \ h, และ \ W พวกมันถูกปล่อยทิ้งไว้โดยไม่มีใครแตะต้องเครื่องหมายวงเล็บเหลี่ยมอาจมีความหมายพิเศษในที่ต่าง ๆ แต่ไม่ใช่ในกรณีนี้ ดังนั้นพวกมันจึงถูกทิ้งไว้ในสถานที่ แต่เนื่องจาก a $มีความหมายหลากหลายทุกอย่างพิเศษ\$ลำดับจึงถูกตีความว่าเป็น "เพิกเฉยต่อความพิเศษของเครื่องหมายดอลลาร์และปล่อยให้มันอยู่ที่นั่น" และลำดับนั้นจะถูกแทนที่ด้วย เครื่องหมายดอลลาร์เดียวที่ไม่มีการแยกวิเคราะห์ผลลัพธ์ของสิ่งเหล่านั้นถูกกำหนดให้PS1และเนื่องจากมีเครื่องหมายดอลลาร์ตามตัวอักษรไม่ใช่\$ลำดับมายากลเมื่อเชลล์สร้างพรอมต์จริงคุณเพียงแค่ได้รับเครื่องหมายดอลลาร์และไม่ใช่ตัวละครที่ขึ้นกับผู้ใช้ การแยกวิเคราะห์จริงซับซ้อนกว่าเล็กน้อย แต่นั่นเป็นส่วนสำคัญของมันสำหรับตัวอย่างนี้

สิ่งที่คุณพิมพ์: PS1="[\u@\h \W]\$ "
สิ่งที่เชลล์มอบหมาย: PS1 <- "[\u@\h \W]$ "
สิ่งที่คุณต้องการ: PS1 <- "[\u@\h \W]\$ "
สิ่งที่คุณควรพิมพ์:PS1='[\u@\h \W]\$ '

คุณควรทำอย่างไรต่อไป: อ่านสิ่งที่ต้องการในบทช่วยสอนนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการอ้างอิงเชลล์


1
ใช่คุณอยู่ในจุดที่ฉันใช้เครื่องหมายคำพูดคู่ (ขออภัยที่หายไปจากคำถามเดิม) ขอบคุณที่ชี้ให้เห็นข้อผิดพลาดของฉัน
stripybadger

ถ้าคุณเคยทำจำเป็นต้องใช้ราคาสองครั้งด้วยเหตุผลบางอย่างการใช้งานPS1="...\\\$"เพื่อให้มั่นใจว่าคู่ที่แท้จริง\$ถูกเก็บไว้ในPS1เปลือกในการตีความในภายหลัง
chepner

0

คุณเปลี่ยนไปใช้รากใช้sudo su, suหรือโดยการเข้าสู่ระบบเป็นราก? ใช้idเพื่อตรวจสอบว่าคอมพิวเตอร์ใดที่คุณเห็นว่าคุณเข้าสู่ระบบเนื่องจากอาจส่งผลต่อโปรไฟล์ที่คุณกำลังแก้ไขจริง

ตรวจสอบคำตอบสำหรับ/ubuntu/305052/changing-behavior-of-bash-prompt-when-functioning-as-root

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.