เวลาส่วนใหญ่ที่เอาต์พุตของคำสั่งลงท้ายด้วยอักขระบรรทัดใหม่ แต่บางครั้งมันก็ไม่ได้ดังนั้นเชลล์พรอมต์ถัดไปจะถูกพิมพ์ในบรรทัดเดียวกันพร้อมกับเอาต์พุต
ตัวอย่าง:
root @ hostname [~] # echo -n สวัสดี
helloroot @ hostname [~] #
ฉันพบว่ามันน่ารำคาญมากเสมอ
ตอนนี้ฉันสามารถเพิ่ม "\ n" ที่จุดเริ่มต้นของตัวแปร PS1 ได้ แต่ส่วนใหญ่แล้วจะพิมพ์หนึ่งบรรทัดเพิ่มเติมที่ฉันไม่ต้องการ
เป็นไปได้ไหมที่จะรู้ว่าผลลัพธ์ของคำสั่งสุดท้ายจบลงด้วยการขึ้นบรรทัดใหม่หรือไม่?
โซลูชัน:
(ขอบคุณเดนนิส)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
ในที่แห่งเดียวและ backticks อีกแห่ง คุณสามารถใช้$()
ทั้ง
tput cols
เพราะมันแค่ส่งออกค่าของตัวแปร COLUMNS แล้วและมันก็ช้ากว่าเพราะมันไม่ใช่เชลล์ในตัว นอกจากนี้คุณยังจะต้องรวม\e[K
(เทียบเท่าtput el
) เพื่อลบช่องว่างที่แทรกไว้เพื่อที่คุณจะไม่ได้รับช่องว่างที่ต่อท้ายเมื่อคัดลอกและวางในกรณีเริ่มต้น ในที่สุดคุณจะต้องใส่เวทย์มนตร์ทั้งหมดระหว่างนี้\[
และ\]
มิฉะนั้นทุบตีจะพยายามเดาตำแหน่งเคอร์เซอร์ของคุณและมันจะเลอะเมื่อคุณแก้ไขคำสั่ง / ประวัติของคุณ
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '