เหตุใด bash prompt นี้จึงเก็บบางส่วนของคำสั่งก่อนหน้าเมื่อเลื่อนดูประวัติ


29

คำสั่งทุบตี bash ของฉันซึ่งฉันจะยอมรับว่าขโมยมาจากที่ต่างๆและปูด้วยกันบางครั้งจะเพิ่มบางส่วนของคำสั่งก่อนหน้าตามความยาวเมื่อเลื่อนประวัติทุบตีด้วยลูกศรขึ้น / ลง

ตัวอย่างเช่นหากคำสั่งก่อนหน้าของฉันคือ:

ls
cd /home/caleb
vim .bashrc

เมื่อฉันอยู่ที่การแจ้งของฉันและเลื่อนขึ้นสองครั้งมันอาจดูเหมือน:

$ vim .bcd / home / caleb

จุดที่อักขระห้าตัวแรกเหลือจากคำสั่งสุดท้าย

ไม่มีใครมีความคิดว่าทำไมสิ่งนี้จึงเกิดขึ้นและจะหยุดได้อย่างไร

พรอมต์ของฉันถูกตั้งค่าด้วยรหัสนี้ (ทางยาวรวมที่นี่): https://gist.github.com/1679352


1
ตั้งค่า PS1 เป็นค่าที่ไม่มี vcs crap ทั้งหมดและดูว่าเกิดอะไรขึ้น นั่นคือการคาดเดาของฉัน
Daniel Beck

คุณพบผู้กระทำผิดในพรอมต์ของคุณหรือไม่ ฉันมีปัญหาเดียวกัน
สุดยอด

ใช่ทุบตีสูญเสียสีและไม่สามารถแยกความยาวของสตริงที่มีสีหนีออกมาจากความยาวของสตริงที่มองเห็นได้ นี่คือสิ่งที่ SiegeX กำลังทำอยู่ ฉันสิ้นสุดการสลับเป็น ZSH และใช้พรอมต์ที่แตกต่างกัน ZSH ไม่มีปัญหาเดียวกัน
Caleb Thompson

1
คำตอบก่อนหน้าทั้งสองไม่ได้รับการแก้ไขปัญหาของฉันและไม่ได้ให้คำอธิบายใด ๆ ว่าทำไมสิ่งนี้เกิดขึ้น โปรดตรวจสอบการแจ้งเตือนการทุบตีแบบกำหนดเองเป็นการเขียนทับตัวเองหากใครก็ตามที่ค้นหาจุดนี้
D3 ฮันเตอร์

ปัญหาที่เกี่ยวข้องunix.stackexchange.com/questions/105958/ …
matthiasbe

คำตอบ:


6

ที่ไหนสักแห่งของคุณคือ fubar สิ่งที่มักจะเกิดขึ้นคือเชลล์ของคุณคิดว่ามันส่งออกคำศัพท์ที่ไม่สามารถพิมพ์ได้และคาดว่ามันจะใช้พื้นที่มากขึ้น คำแนะนำที่ดีที่สุดที่ฉันสามารถให้คุณได้คือการเพิ่ม (หรือลบออก) พร้อมท์ของคุณอย่างเป็นระบบจนกว่าพฤติกรรมนี้จะหยุดเพื่อแยกรหัสที่เป็นสาเหตุของปัญหานี้


37

รหัสสีจะต้องห่อในวงเล็บเหลี่ยม วงเล็บแจ้ง bash ว่าข้อความที่ล้อมรอบไม่ควรพิมพ์

การสร้างตามตัวอย่างของ @ Phreditor แสดงให้เห็นว่าการจัดรูปแบบใด ๆ ที่ทำหลังจากขึ้นบรรทัดใหม่จะส่งผลให้เกิดปัญหาดั้งเดิม:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

การห่อโค้ดรูปแบบใน [] ทำให้มั่นใจได้ว่าพฤติกรรมที่น่ารำคาญจะไม่เกิดขึ้น:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

เอกสารประกอบ: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

เนื่องจากการจัดรูปแบบ PS1 ทำให้ค่ามีความยาวและอ่านยากฉันจึงใส่รหัสรูปแบบในตัวแปร:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
นี่ควรเป็นคำตอบที่ยอมรับได้ ทำการแก้ไขปัญหา
Atcold

1
ควรสังเกต (เพราะฉันไม่สามารถทราบได้;)) ว่าในระเบียบของเครื่องหมายแบ็กสแลชและเครื่องหมายวงเล็บเหลี่ยมวงเล็บเหลี่ยมที่เป็นไปตามลำดับการหลบหลีก\033ไม่ควรหลีกเลี่ยง เฉพาะวงเล็บเหลี่ยมที่ห่อหุ้มเท่านั้นที่จะถูกหลบหนี
Benjam

วิธีสร้างความสับสนให้กับฉันในการจัดการกับตัวละครพิเศษเหล่านั้นการใช้ผลลัพธ์ google ครั้งแรกช่วยสร้างการทำงานที่รวดเร็วตามที่ฉันต้องการ: ezprompt.net
Mallox

ฉันต้องการที่จะปรับแต่งสีของฉันพร้อมท์สำหรับปี แต่ไม่เคยมีตั้งแต่ฉันมีปัญหานี้เสมอ! ฉันไม่สามารถหาสาเหตุได้ว่าทำไมฉันจึงหยุดและเก็บทุกสิ่งที่เป็นสีขาว ... ฉันเพิ่งจะติดตั้งคอมพิวเตอร์เครื่องใหม่และในที่สุดก็ถึงเวลาที่ฉันต้องออกจาก Google จริง ๆ ในครั้งเดียว ... ดีใจที่ฉันทำ! ขอบคุณสำหรับบทเรียนที่ยอดเยี่ยมนี้
TylerH4

8

ฉันมีปัญหาเดียวกันและเกี่ยวข้องกับคำจำกัดความของสี

ในกรณีของฉันฉันมีพรอมต์หลายบรรทัด (ให้พื้นที่ส่วนใหญ่สำหรับคำสั่งปัจจุบันโดยไม่คำนึงถึงความยาวพา ธ ที่แสดงโดยพรอมต์)

รุ่นไม่ดี:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

รุ่นที่ดี:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mยุติสี หากอยู่หลังบรรทัดใหม่ ( \n) จะเป็นการป้องกันการเขียนซ้ำที่เหมาะสมในเทอร์มินัลเพื่อเขียนทับคำสั่งก่อนหน้าด้วยสีพื้นหลัง การย้ายที่อยู่เบื้องหลังบรรทัดใหม่ช่วยแก้ไขปัญหาได้

(ใช้ Terminal ใน Mac OS 10.8)


สิ่งนี้ชี้ให้เห็นปัญหาสำหรับฉันในขณะที่คำตอบที่ยอมรับในปัจจุบันนั้นกว้างเกินไป
Brian

นี่คือคำตอบที่แม่นยำยิ่งขึ้นและควรเป็นผู้ชนะ (และเป็นวิธีแก้ปัญหาของฉันเช่นกัน)
craveytrain

\nเป็นผู้ร้ายสำหรับฉันมากเกินไป ขอบคุณ!
mhulse

3

จริง ๆ แล้วฉันคิดว่าสิ่งนี้เกี่ยวข้องกับตัวคั่น 'ไม่ใช่ตัวอักษร' ที่ขาดหายไป ฉันมีปัญหาเดียวกันทุกประการ แต่การย้ายก่อนที่บรรทัดใหม่ (\ n) ไม่สามารถแก้ไขได้ แต่ฉันล้อมรอบตัวละครที่ไม่ได้พิมพ์อย่างถูกต้องทั้งหมด (ที่นี่คำสั่งระบายสี) ด้วย '\ [' และ '\]'

ไม่ดี (ใช้งานได้ แต่มีปัญหาเกี่ยวกับประวัติความเป็นมาที่อธิบายไว้ด้านบน):

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

ดี (ล้อมรอบทุกคำสั่งสีด้วย '\ [' และ '\]' - ไม่แสดงประวัติคำสั่งที่ถูกบด):

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

และถ้าคุณใส่สิ่งนี้ลงในสิ่งที่ต้องการ SecureCRT เพื่อส่งอัตโนมัติเมื่อเข้าสู่ระบบคุณอาจต้องหลบหนีทุกอย่าง (ใส่แบ็กสแลชสองครั้งทุกที่) หากระบบการเข้าสู่ระบบอัตโนมัติใช้แบ็กสแลชตัวแรกเพื่อกำหนดอักขระที่จะส่ง :

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(นี่เป็นเรื่องจริงของ SecureCRT และอาจเป็นจริงสำหรับผู้อื่นเช่น PuTTY หรือ TeraTerm - ต้องมีการทดสอบในส่วนของคุณ)

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