Bash: จะรู้ได้อย่างไรว่าผลลัพธ์ของคำสั่งสุดท้ายลงท้ายด้วยการขึ้นบรรทัดใหม่หรือไม่?


10

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

ตัวอย่าง:

root @ hostname [~] # echo -n สวัสดี
helloroot @ hostname [~] #

ฉันพบว่ามันน่ารำคาญมากเสมอ
ตอนนี้ฉันสามารถเพิ่ม "\ n" ที่จุดเริ่มต้นของตัวแปร PS1 ได้ แต่ส่วนใหญ่แล้วจะพิมพ์หนึ่งบรรทัดเพิ่มเติมที่ฉันไม่ต้องการ

เป็นไปได้ไหมที่จะรู้ว่าผลลัพธ์ของคำสั่งสุดท้ายจบลงด้วยการขึ้นบรรทัดใหม่หรือไม่?


โซลูชัน:
(ขอบคุณเดนนิส)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '

สิ่งนี้ควรถูกย้ายไปยัง superuser
ℝaphink

ฉันชอบเวอร์ชั่นของคุณ! คุณเคยใช้$()ในที่แห่งเดียวและ backticks อีกแห่ง คุณสามารถใช้$()ทั้ง
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ฉันรู้ว่า. แต่สำหรับฉันมันง่ายกว่าที่จะอ่านด้วยวิธีนี้
GetFree

ฉันจะไม่ใช้tput colsเพราะมันแค่ส่งออกค่าของตัวแปร COLUMNS แล้วและมันก็ช้ากว่าเพราะมันไม่ใช่เชลล์ในตัว นอกจากนี้คุณยังจะต้องรวม\e[K(เทียบเท่าtput el) เพื่อลบช่องว่างที่แทรกไว้เพื่อที่คุณจะไม่ได้รับช่องว่างที่ต่อท้ายเมื่อคัดลอกและวางในกรณีเริ่มต้น ในที่สุดคุณจะต้องใส่เวทย์มนตร์ทั้งหมดระหว่างนี้\[และ\]มิฉะนั้นทุบตีจะพยายามเดาตำแหน่งเคอร์เซอร์ของคุณและมันจะเลอะเมื่อคุณแก้ไขคำสั่ง / ประวัติของคุณ
dlitz

1
สิ่งทั้งหมดสามารถทำได้เพียง:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

คำตอบ:


6

ฉันได้ทดลองทำสิ่งต่อไปนี้เพื่อเลียนแบบคุณลักษณะจากzshใน Bash:

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

มันออกเครื่องหมายร้อยละวิดีโอย้อนกลับตามด้วยช่องว่างมากมายเพื่อให้ห่อไปที่บรรทัดถัดไปจากนั้นส่งคืนค่าขนส่งตามด้วยเครื่องหมายดอลลาร์และช่องว่าง คุณสามารถเพิ่มการหลีกเลี่ยงพรอมต์หลัง "\ 015" เพื่อกำหนดพรอมต์ของคุณเอง

การใช้สิ่งนี้ขึ้นอยู่กับวิธีที่เทอร์มินัลของคุณจัดการการตัดบรรทัดขอบด้านขวา (ระยะขอบอัตโนมัติ) ความยาวของ PROMPT_SP นั้นเป็นอิสระ แต่ควรมีอย่างน้อย 80 หรือความกว้างเทอร์มินัลตามปกติของคุณคืออะไร คุณอาจต้องยากรหัสที่คุ้มค่าถ้า $ คอลัมน์ไม่ได้ตั้งค่ายังตามเวลาที่ห่วงคือการทำงานในfor ~/.bashrcคุณอาจต้องการshopt -s checkwinsizeหากยังไม่ได้ตั้งค่า


ผมสงสัยว่าทำไมคน downvoted แต่ละคำตอบ อืม ... ไม่มีคำอธิบาย มีประโยชน์อย่างไร
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

นี่เป็นอีกวิธีหนึ่งโดยไม่ต้องใช้การวนซ้ำเพื่อสร้างสตริงของแผ่น:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
หยุดชั่วคราวจนกว่าจะมีประกาศ

"เครื่องหมายเปอร์เซ็นต์วิดีโอย้อนกลับ" คืออะไร คำว่า "วิดีโอ" ทำให้ฉันสับสนและฉันไม่สามารถหาคำตอบใน Google ได้
davidchambers

1
@davidchambers: พื้นหลังของตัวละครจะแสดงเป็นสีพื้นหน้าและตัวละครจะปรากฏในสีพื้นหลัง ดูman 5 terminfoและค้นหา "reverse video" เพื่อดูเอกสารบางอย่างที่ใช้คำศัพท์นี้
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

0

ไม่เป็นไปไม่ได้ Bash เองไม่ได้ประมวลผลหรือดูผลลัพธ์ของโปรแกรมที่เริ่มต้นขึ้น

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


ความคิดที่ดี. ปัญหาเดียวคือ ... เป็นไปได้ไหมที่จะรู้ตำแหน่งของเคอร์เซอร์?
GetFree

0

zshพยายามที่จะแก้ปัญหาของคุณ หากผลลัพธ์สุดท้ายจบลงโดยไม่มีการขึ้นบรรทัดใหม่คุณจะได้รับ:

$ echo -n 'abc'
abc%
$ 

จุดที่การ%ใช้แบ็คกราวน์ / พื้นหน้ากลับด้าน ไม่แน่ใจว่ามันพกพาไปได้bashหรือไม่

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