ฉันต้องการกำหนดค่า bash เพื่อประมวลผลclearคำสั่งทุกครั้งที่ฉันพิมพ์คำสั่งบางคำสั่งในเทอร์มินัล (ก่อนดำเนินการคำสั่งของฉัน) ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันใช้ Debian Linux
ฉันต้องการกำหนดค่า bash เพื่อประมวลผลclearคำสั่งทุกครั้งที่ฉันพิมพ์คำสั่งบางคำสั่งในเทอร์มินัล (ก่อนดำเนินการคำสั่งของฉัน) ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันใช้ Debian Linux
คำตอบ:
ทุบตีมีตะขอ 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
Enterก่อนที่จะดำเนินการคำสั่ง มันได้ผลเช่นนี้สำหรับฉัน เบ็ด preexec จะถูกดำเนินการสำหรับแต่ละคำสั่งแบบโต้ตอบมันไม่สำคัญว่าคำสั่งนั้นเป็นคำสั่งในตัวหรือคำสั่งภายนอกหรือหลายคำสั่ง
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;ปัญหาคือ PROMPT_COMMAND กำลังทำงานอยู่และติดกับดักหลังจากคำสั่งจริง บางคนบอกได้ไหมว่าทำไมมา local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;ที่นี่
history -1พิมพ์บรรทัดคำสั่งสุดท้ายโดยมีหมายเลขประวัติด้านหน้า ตัวกรอง sed ตัดหมายเลขประวัติออก
bind 'RETURN: "\e[1~clear; \e[4~\n"'
หลังจากนั้นทุกครั้งที่คุณกดreturnแทนที่จะเขียนเพียงแค่\nมันจะย้ายไปที่จุดเริ่มต้นของบรรทัดป้อนข้อความclear;จากนั้นย้ายไปยังจุดสิ้นสุดและป้อน\nตามที่คาดไว้
clearคำสั่งด้วยคำสั่ง
clearจะถูกดำเนินการก่อนที่คำสั่งและเอาท์พุทคำสั่งจะไม่หายไป อย่างไรก็ตามในกรณีที่มีข้อความแจ้ง
clear; \n
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""มันจะย้ายไปที่จุดเริ่มต้นพิมพ์ls;#ความเห็นสิ่งที่อยู่ที่นั่นและเรียกใช้lsคำสั่งอย่างถูกต้อง! ขอบคุณ!
จากคำถามที่ฉันถามในวันนี้ (โดยให้เครดิตกับคำตอบของผู้ใช้@ 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) และคำตอบอื่น ๆ ในหัวข้อนี้ไม่ได้ นอกจากนี้ยังไม่ก่อให้เกิดมลพิษกับคำสั่ง 'ชัดเจน' ทุกคำสั่งอื่น ๆ
cb4() {
preexec () {
clear
}
}
ใช้เบ็ดที่เรียกว่าpreexecยืนยันทำงานกับ zsh เกินไป
จากนั้นเซสชันใด ๆ ที่คุณต้องการลบโดยอัตโนมัติก่อนทุกคำสั่งที่คุณเรียกใช้: cb4
preexec () {
clear
}
แทนที่คำclearด้วยtput reset
tput เป็นทางเลือก แต่เร่งความเร็วกระบวนการรีเซ็ต