วิธีทำให้ bash ใส่พรอมต์บนบรรทัดใหม่หลังจากคำสั่ง cat?


17

สิ่งที่ฉันได้รับ:

host:~ user$ cat example.txt
some texthost:~ stas$

สิ่งที่ฉันต้องการได้รับ:

host:~ user$ cat example.txt
some text
host:~ stas$

มีวิธีที่ฉันสามารถcatประพฤติเช่นนี้หรือไม่?

ฉันใช้ทุบตีใน Mac OS X

คำตอบ:


15

เครื่องมือ unix ส่วนใหญ่ได้รับการออกแบบให้ทำงานได้ดีกับไฟล์ข้อความ ไฟล์ข้อความประกอบด้วยลำดับของบรรทัด บรรทัดประกอบด้วยลำดับของอักขระที่พิมพ์ได้ซึ่งลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ โดยเฉพาะอย่างยิ่งอักขระสุดท้ายของไฟล์ข้อความที่ไม่ว่างเปล่าจะเป็นอักขระขึ้นบรรทัดใหม่เสมอ เห็นได้ชัดว่าexample.txtมีเฉพาะsome textเมื่อไม่มีการขึ้นบรรทัดใหม่ดังนั้นจึงไม่ใช่ไฟล์ข้อความ

catทำงานง่ายๆ การเปลี่ยนไฟล์ตามอำเภอใจให้เป็นไฟล์ข้อความไม่ได้เป็นส่วนหนึ่งของงานนั้น เครื่องมืออื่น ๆ จะเปลี่ยนอินพุตเป็นไฟล์ข้อความเสมอ ถ้าคุณไม่แน่ใจว่าไฟล์ที่คุณกำลังแสดงจบลงด้วยการขึ้นบรรทัดใหม่ให้ลองเรียกใช้แทนawk 1cat

คุณสามารถทำให้ bash แสดงพรอมต์บนบรรทัดถัดไปหากคำสั่งก่อนหน้านี้ปล่อยเคอร์เซอร์ไว้ที่อื่นนอกเหนือจากระยะขอบสุดท้าย ใส่สิ่งนี้ในของคุณ.bashrc(รูปแบบโดยรับฟรีข้อเสนอโดย Dennis Williamson ):

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

ขอบคุณมากสำหรับวิธีแก้ปัญหาการทำงานและคำอธิบายสั้น ๆ ! ฉันเข้าใจว่านี่เป็นสิ่งที่แย่สำหรับคนจนcatดังนั้นฉันจะเก็บเรื่องนี้ไว้เป็นทางเลือกสุดท้ายสำหรับช่วงเวลาที่ปัญหานี้เริ่มรบกวนฉันอีกครั้ง
Stanislav Shabalin

เนื่องจากสิ่งนี้เป็นการกำหนดค่าตามความชอบของ bash มันสามารถแบ่งคำสั่ง piping ได้หรือไม่?
Stanislav Shabalin

1
@StanislavShabalin สิ่งนี้ไม่ส่งผลกระทบต่อการ piping แต่จะมีเพียง prompt
Gilles 'หยุดความชั่วร้าย'

ฉันต้องการลบ "-1" หลังจาก "COLUMNS" เพื่อให้ทำงานได้อย่างถูกต้อง
rafak

วิธีนี้ทำให้พรอมต์เคลื่อนที่เมื่อหน้าต่างปรับขนาดเทอร์มินัล ฉันพบว่าจะทำให้งานนี้ได้อย่างน่าเชื่อถือฉันได้รับคอลัมน์ในปัจจุบันPROMPT_COMMANDและถ้ามันไม่เป็น 0 ใช้บรรทัดใหม่ ( \n) PS1เป็นตัวอักษรตัวแรกของ
Brian Donovan

10

ฉันชอบวิธีต่อไปนี้ ...

cat example.txt ; echo

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

ข้อเสียเพียงอย่างเดียวคือคุณจะได้รับการขึ้นบรรทัดใหม่หากไฟล์มีการขึ้นบรรทัดใหม่ของตัวเอง


7

ฉันเริ่มใช้คำตอบของ @ Gilles แต่พบว่าหากเทอร์มินัลเปลี่ยนจำนวนคอลัมน์การแจ้งจะไม่อยู่ที่จุดเริ่มต้นของบรรทัดอีกต่อไปตามที่คาดไว้ สิ่งนี้สามารถเกิดขึ้นได้จากหลายสาเหตุรวมถึงการแยก tmux / หน้าจอการปรับขนาดด้วยตนเองของคอนเทนเนอร์ GUI การเปลี่ยนแบบอักษรและอื่น ๆ

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

###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_prompt() {
  PS1=""

  if [ "$(__get_terminal_column)" != 0 ]; then
    PS1="\n"
  fi

  PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}

###
# Get the current terminal column value.
#
# From /programming//a/2575525/549363.
###
__get_terminal_column() {
  exec < /dev/tty
  local oldstty=$(stty -g)
  stty raw -echo min 0
  echo -en "\033[6n" > /dev/tty
  local pos
  IFS=';' read -r -d R -a pos
  stty $oldstty
  echo "$((${pos[1]} - 1))"
}

# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"

# Use our prompt configuration function, preserving whatever existing
# PROMPT_COMMAND might be configured.
PROMPT_COMMAND="__configure_prompt;$PROMPT_COMMAND"

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

@onlynone อาจเป็นไปได้ว่าคำสั่งของคุณจะไม่ถูกแยกออกเป็นรายบุคคลและตรงเวลา__get_terminal_columnใช่หรือไม่
Androbin

แทนที่จะPS1="\n"ฉันเพียงแค่มีและไม่จำเป็นต้องปรับเปลี่ยนecho PS1
Androbin

4

ปัญหาที่อาจเกิดขึ้นคือ example.txt ของคุณไม่มีบรรทัดใหม่ที่ท้ายไฟล์ของคุณ


2
สิ่งนี้คือฉันไม่สนใจว่าไฟล์จะมีการขึ้นบรรทัดใหม่ในตอนท้ายหรือไม่ ฉันต้องการที่จะเห็นแมวเอาท์พุทที่ชัดเจนมากขึ้นและไม่รบกวน :-) และฉันเข้าใจว่ามันไม่ใช่catงานดังนั้นฉันอาจกำลังมองหาวิธีแก้ปัญหาบางอย่าง
Stanislav Shabalin

1
นี่เป็นคำตอบที่ไม่มีคำว่าexample.txtไม่มีบรรทัดใหม่ที่ท้ายไฟล์เป็นจุดรวมของคำถาม
Willem D'Haeseleer

2

หากคุณยืนยันในการใช้catงานสิ่งนี้จะใช้ได้กับไฟล์ทั้งสองประเภทโดยมีและไม่มีบรรทัดใหม่ในตอนท้าย:

echo "`cat example.txt`"

คุณสามารถเปลี่ยนเป็นฟังก์ชั่นที่มีชื่อที่คุณเลือก (คู่cat) ใน.bashrc:

cat1(){ echo "`/bin/cat $@`";}

1
ตอนนี้มันค่อนข้างมากเกินไปแม้ว่ามันจะใช้ได้ ;-) ขอบคุณนะ!
Stanislav Shabalin

0

คุณสามารถเพิ่ม. bashrc ได้เช่นกัน

PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"

ทำงานได้สำหรับฉัน


1
สิ่งนี้จะเพิ่มบรรทัดว่างพิเศษในเทอร์มินัลเมื่อใดก็ตามที่ยูทิลิตี้แสดงผลบางสิ่งที่ถูกยกเลิกโดยการขึ้นบรรทัดใหม่
Kusalananda

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