ฉันสามารถกำหนดค่า bash เพื่อดำเนินการ "ล้าง" ก่อนทุกคำสั่งที่พิมพ์ในคอนโซลหรือไม่


22

ฉันต้องการกำหนดค่า bash เพื่อประมวลผลclearคำสั่งทุกครั้งที่ฉันพิมพ์คำสั่งบางคำสั่งในเทอร์มินัล (ก่อนดำเนินการคำสั่งของฉัน) ฉันจะทำสิ่งนั้นได้อย่างไร

ฉันใช้ Debian Linux


คุณพบว่ากระทู้นี้มีประโยชน์
ธ.ค.

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

คำตอบ:


22

ทุบตีมีตะขอ precommand เรียงจาก

preexec () {
  clear
}
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return                     # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

Gilles: ฉันวางข้างบนลงในเทอร์มินัล konsole และเอาท์พุทจากแต่ละคำสั่งที่ฉันป้อนในเวลาต่อมาก็ถูกล้างออกก่อนที่ฉันจะสามารถอ่านได้ ฉันพลาดอะไรไปรึเปล่า? นอกจากนี้จะเกิดอะไรขึ้นสำหรับสิ่งนี้ (และคำตอบอื่น ๆ ด้านล่าง) หากฉันเรียกใช้สคริปต์ทุบตีหลายบรรทัดที่มากกว่าหนึ่งบรรทัด (หรือบรรทัดอื่นที่ไม่ใช่บรรทัดสุดท้าย) สร้างเอาต์พุตที่น่าสนใจ
โจ

@ โจนี้ควรล้างหน้าจอหลังจากที่คุณกดEnterก่อนที่จะดำเนินการคำสั่ง มันได้ผลเช่นนี้สำหรับฉัน เบ็ด preexec จะถูกดำเนินการสำหรับแต่ละคำสั่งแบบโต้ตอบมันไม่สำคัญว่าคำสั่งนั้นเป็นคำสั่งในตัวหรือคำสั่งภายนอกหรือหลายคำสั่ง
Gilles 'หยุดชั่วร้าย'

1
@Joe คุณต้องเพิ่มตะโกนบรรทัดนี้ไม่ทำอะไรเลยถ้าเสร็จสิ้น [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;ปัญหาคือ PROMPT_COMMAND กำลังทำงานอยู่และติดกับดักหลังจากคำสั่งจริง บางคนบอกได้ไหมว่าทำไมมา local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;ที่นี่
MageProspero

@JamesAndino history -1พิมพ์บรรทัดคำสั่งสุดท้ายโดยมีหมายเลขประวัติด้านหน้า ตัวกรอง sed ตัดหมายเลขประวัติออก
Gilles 'SO- หยุดความชั่วร้าย'

@ JamesAndino นั่นทำให้มันใช้งานได้ (และฉันเห็น Giles เพิ่มคำตอบของเขา)
Joe

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

หลังจากนั้นทุกครั้งที่คุณกดreturnแทนที่จะเขียนเพียงแค่\nมันจะย้ายไปที่จุดเริ่มต้นของบรรทัดป้อนข้อความclear;จากนั้นย้ายไปยังจุดสิ้นสุดและป้อน\nตามที่คาดไว้


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

2
@ jw013 ความแตกต่างคือในกรณีของฉันclearจะถูกดำเนินการก่อนที่คำสั่งและเอาท์พุทคำสั่งจะไม่หายไป อย่างไรก็ตามในกรณีที่มีข้อความแจ้ง
เร่ง

ฉันหวังว่าจะมีวิธีในการทำเช่นนี้โดยไม่ต้องแก้ไขบรรทัดคำสั่งเอง - ฉันแน่ใจว่าสิ่งนี้จะทำลายวิธีที่น่าสนใจสำหรับคำสั่งที่ซับซ้อนหรือหลายบรรทัด แต่ฉันไม่สามารถหาวิธีที่ดีกว่านี้ได้
jw013

@ jw013 คุณมีสิทธิที่จะไม่หยุดพักหลายสาย .. มันแทรกการส่งออกสำหรับแต่ละพิเศษclear; \n
Peter.O

เคล็ดลับนี้ดีมากขอบคุณ !! ฉันต้องการผูกโค้ดเฉพาะกับ F2 แต่บางครั้งบรรทัดมีคำสั่งที่ฉันพิมพ์ แต่ไม่ได้ดำเนินการดังนั้นกับ ex นี้: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""มันจะย้ายไปที่จุดเริ่มต้นพิมพ์ls;#ความเห็นสิ่งที่อยู่ที่นั่นและเรียกใช้lsคำสั่งอย่างถูกต้อง! ขอบคุณ!
กุมภ์

2

จากคำถามที่ฉันถามในวันนี้ (โดยให้เครดิตกับคำตอบของผู้ใช้@ aecolley ):

bind '"\C-m": "\C-l\C-j"'

การ\C-mจำลองคีย์ 'Enter' เป็นการ\C-lจำลองCtrl+lตามที่เห็นได้ชัดและปุ่ม\C-jคือ "newline-and-indent" ดังนั้นคำสั่งจะรวมคีย์ Enter เข้ากับ Ctrl + l & Ctrl + j

ที่ใช้งานได้กับ GNU bash, รุ่น 3.2.53 (1) -release (x86_64-apple-darwin14) และคำตอบอื่น ๆ ในหัวข้อนี้ไม่ได้ นอกจากนี้ยังไม่ก่อให้เกิดมลพิษกับคำสั่ง 'ชัดเจน' ทุกคำสั่งอื่น ๆ


1
หมายเหตุ: หากใช้งานผ่าน ssh คุณต้องเรียกใช้งานในสภาพแวดล้อมนั้นหรือเกิดความประหลาด
TRB

greate มันทำงานบน terminal อูบุนตู 16.04 ของฉันขอบคุณ แต่มันทำงานอย่างไรคุณช่วยลิงค์หรือเอกสารบางส่วนได้มั้ย
Andrzej Rehmann

0

พิจารณาการล้างเฉพาะเมื่อคุณต้องการ

cb4() {
  preexec () {
    clear
  }
}

ใช้เบ็ดที่เรียกว่าpreexecยืนยันทำงานกับ zsh เกินไป

จากนั้นเซสชันใด ๆ ที่คุณต้องการลบโดยอัตโนมัติก่อนทุกคำสั่งที่คุณเรียกใช้: cb4

หากคุณมั่นใจว่าคุณต้องการชัดเจนในทุกบริบท

preexec () {
  clear
}

และถ้าคุณต้องการรีเซ็ตเครื่อง

แทนที่คำclearด้วยtput reset

tput เป็นทางเลือก แต่เร่งความเร็วกระบวนการรีเซ็ต

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