ในทุบตีจากภายใน PROMPT_COMMAND มีวิธีที่จะบอกว่าผู้ใช้เพียงกด 'กลับ' และไม่ได้ป้อนคำสั่งหรือไม่?
ในทุบตีจากภายใน PROMPT_COMMAND มีวิธีที่จะบอกว่าผู้ใช้เพียงกด 'กลับ' และไม่ได้ป้อนคำสั่งหรือไม่?
คำตอบ:
ตรวจสอบว่าหมายเลขประวัติเพิ่มขึ้นหรือไม่ พรอมต์ที่ถูกยกเลิกหรือพรอมต์ที่ผู้ใช้เพิ่งกดEnterจะไม่เพิ่มหมายเลขประวัติ
หมายเลขประวัติพร้อมใช้งานในตัวแปรHISTCMD
แต่ไม่สามารถใช้ได้ในPROMPT_COMMAND
(เพราะสิ่งที่คุณต้องการในความเป็นจริงหมายเลขประวัติของคำสั่งก่อนหน้าคำสั่งที่เรียกใช้PROMPT_COMMAND
ตัวเองไม่มีหมายเลขประวัติ) fc
คุณจะได้รับตัวเลขจากการส่งออกของ
prompt_command () {
HISTCMD_previous=$(fc -l -1); HISTCMD_previous=${HISTCMD_previous%%$'[\t ]'*}
if [[ -z $HISTCMD_before_last ]]; then
# initial prompt
elif [[ $HISTCMD_before_last = "$HISTCMD_previous" ]]; then
# cancelled prompt
else
# a command was run
fi
HISTCMD_before_last=$HISTCMD_previous
}
PROMPT_COMMAND='prompt_command'
โปรดทราบว่าหากคุณเปิดใช้การบีบอัดรายการที่ซ้ำกันในประวัติศาสตร์ ( HISTCONTROL=ignoredups
หรือHISTCONTROL=erasedups
) สิ่งนี้จะรายงานคำสั่งที่ว่างเปล่าโดยไม่ตั้งใจหลังจากเรียกใช้คำสั่งที่เหมือนกันสองคำติดต่อกันอย่างต่อเนื่อง
${HISTCMD_previous%%$'[\t ]'*}
บิตหายไป$'…'
และสิ้นสุดการตัดทอนหลังจาก`,
t` หรือเว้นวรรคแทนแท็บหรือเว้นวรรคหลัง แต่ทุบตีพิมพ์แท็บ
มีวิธีแก้ปัญหา แต่มีข้อกำหนดบางประการ:
คุณต้องตั้งค่า$HISTCONTROL
ให้บันทึกคำสั่งทั้งหมดรวมทั้งทำซ้ำและเว้นวรรค ดังนั้นตั้ง:
HISTCONTROL=
ตอนนี้กำหนดฟังก์ชั่นการโทรเป็น$PROMPT_COMMAND
:
isnewline () {
# read the last history number
prompt_command__isnewline__last="$prompt_command__isnewline__curr"
# get the current history number
prompt_command__isnewline__curr="$(history 1 | grep -oP '^\ +\K[0-9]+')"
[ "$prompt_command__isnewline__curr" = "$prompt_command__isnewline__last" ] && \
echo "User hit return"
}
ตอนนี้ตั้งค่า$PROMPT_COMMAND
ตัวแปร:
PROMPT_COMMAND="isnewline"
ดูผลลัพธ์:
user@host:~$ true
user@host:~$ <return>
User hit return
user@host:~$ <space><return>
user@host:~$
last
จะถูกเก็บรักษาไว้ตั้งแต่การเรียกisnewline
ใช้ครั้งถัดไปจนถึงถัดไป (เลือกชื่อสามัญที่น้อยกว่าprompt_command__isnewline__last
เพื่อหลีกเลี่ยงการปะทะกัน)
HISTCONTROL="" function last_was_blank { local last_command="$(history 1)" if [[ "$last_was_blank_PREVIOUS_LINE" = "$last_command" ]] ; then echo "true" else echo "false" fi export last_was_blank_PREVIOUS_LINE="$last_command" } PROMPT_COMMAND=last_was_blank
ผมไม่ทราบวิธีที่จะทำอย่างนั้นต่อ se แต่คุณสามารถได้รับผลกระทบเดียวกันโดยใช้
ดักจับดีบักsome_command_or_function
สิ่งนี้จะทำให้การsome_command_or_function
ถูกเรียกเมื่อใดก็ตามที่คุณเรียกใช้คำสั่ง สิ่งที่ยุ่งยากคือมันจะไม่ถูกเรียกถ้าคุณเพิ่งกดEnter- เว้นแต่ว่าคุณได้กำหนด PROMPT_COMMAND ไว้ในกรณีนี้การกดปุ่มEnterจะเรียกใช้ PROMPT_COMMAND ซึ่งในทางกลับกันจะทำให้เกิดกับดัก
บางทีวิธีที่ง่ายที่สุดในการบรรลุผลลัพธ์ที่คุณต้องการคือการกำหนดฟังก์ชั่นการตรวจแก้จุดบกพร่องแทนการใช้ PROMPT_COMMAND แต่ฉันบอกไม่ได้เพราะฉันไม่รู้ว่าคุณต้องการผลอะไร หากคุณต้องการสิ่งที่จะเกิดขึ้นเมื่อคุณกดEnterและสิ่งที่แตกต่าง / เพิ่มเติมเกิดขึ้นเมื่อคุณพิมพ์คำสั่งแล้ว (AFAIK) คุณต้องใช้กับดักจับการดีบักและ PROMPT_COMMAND ดูคำตอบนี้และอัน นี้ เพื่อหาวิธีที่จะทำให้กลไกทั้งสองเล่นร่วมกันได้ดี
(ซึ่งจะได้รับความคิดเห็นที่ได้รับการยอมรับคำตอบถ้าผมได้รับอนุญาตให้เพิ่มความคิดเห็น ... ) @schlimmen คุณอาจตั้งHISTTIMEFORMAT
เพื่อสิ่งที่ต้องการแล้วบันทึกและเปรียบเทียบHISTTIMEFORMAT='%F %T '
history 1
เป็นเพราะการลบอย่างน้อยเวลาประทับของคำสั่งสุดท้าย (อาจจะซ้ำ) การเปลี่ยนแปลงทุกครั้ง --- และด้วยการHISSTIMEFORMAT
ตั้งค่าอย่างเหมาะสมhistory 1
จะแสดงการประทับเวลา (ไม่เหมือนfc
) และทำให้แตกต่างกันระหว่างคำสั่งซ้ำ