วิธีการแบ่งปันประวัติทุบตีในแท็บต่าง ๆ


19

ฉันใช้คำตอบใน/unix//a/1292/41729เพื่อเปิดใช้งานประวัติการแชร์แบบเรียลไทม์ระหว่างเทอร์มินัลทุบตีที่แยกต่างหาก ตามที่อธิบายไว้ในคำตอบข้างต้นสิ่งนี้สามารถทำได้โดยการเพิ่ม:

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

สิ่งนี้ใช้ได้ดีถ้าเปลือก bash นั้นแยกจากกัน (เช่นเปิดเทอร์มินัล bash ที่แตกต่างกันโดยใช้CTRL+ALT+Tอย่างไรก็ตามมันใช้ไม่ได้ถ้าฉันใช้tabs(จากเทอร์มินัลเปิด `CTRL + SHIFT + T) แทนที่จะเป็นวินโดว์ใหม่ ฉันสามารถแบ่งปันประวัติทุบตีในแท็บต่างๆได้หรือไม่

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

ตัวอย่างผลลัพธ์ (T1 หมายถึงเทอร์มินัล 1 และเทอร์มินัล 2 2):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

หวังว่านี่จะมีคำใบ้ใด ๆ !


คุณเพิ่มลงใน~.bashrcไฟล์ของคุณหรือไม่ ในด้านการส่งออกตัวแปรเหล่านั้นไม่มีจุดหมาย เพียงแค่เสียพื้นที่สิ่งแวดล้อม
geirha

@geirha ใช่ฉันเพิ่มลงในไฟล์. bashrc แล้ว ขอบคุณสำหรับความคิดเห็นในการส่งออก
lucacerone

คำตอบ:


2

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

ในการทดสอบให้ลองชุดตัวเลือกนี้ในขั้นตอนของคุณ (ฉันเพิ่มส่วนเสริม<enter>ใน T1):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

ด้วยการกดปุ่มพิเศษนี้คุณจะได้รับพรอมต์ใหม่ซึ่งเรียกใช้PROMPT_COMMANDและซิงค์ประวัติของคุณและดังนั้นฉันจึงคาดว่าลูกศรขึ้นนี้จะดึงข้อมูลcdแทนlsตามที่คุณต้องการ น่าเสียดายที่ฉันไม่คิดว่าจะมีวิธีที่จะทำให้การซิงค์เกิดขึ้นทันทีในเทอร์มินัลทั้งหมดโดยไม่ต้องรันคำสั่งใด ๆ ตามที่คุณต้องการ อย่างมีประสิทธิภาพสิ่งนี้จะทำให้เซสชันการเข้าสู่ระบบของคุณทั้งหมดต้องซิงโครไนซ์รายการประวัติอย่างต่อเนื่องตลอดเวลาซึ่งจะเป็นการสูญเสีย CPU และปริมาณงานของดิสก์จำนวนมาก


คุณถูกต้องกด Enter มันจะซิงค์หลังจาก แม้ว่าจะมีหน่วยความจำหรือ CPU เสียฉันจะบังคับให้ซิงค์ได้อย่างไร (ถ้ามันมากเกินไปฉันสามารถปิดการใช้งานได้ตลอดเวลา แต่ฉันอยากจะลอง)
lucacerone

1

ฉันถามคำถามเดียวกันและนี่คือคำตอบที่ฉันคิดขึ้นมา

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync


สอง clarfications ก่อนที่ฉันจะลอง: ฉันควรลบ hystory อื่น - ตัวเลือกแล้ว? นี่ไปใน. bashrc ใช่มั้ย
lucacerone

น่าเสียดายที่มันใช้งานไม่ได้ ...
lucacerone

แต่ละครั้งที่HISTFILESIZEมีการเปลี่ยนแปลงมันจะพยายามตัดทอนไฟล์ประวัติที่มีอยู่โดยอัตโนมัติ การเปลี่ยนแปลงHISTSIZEมีผลคล้ายกับประวัติปัจจุบัน สำหรับการอ้างอิงดูความคิดเห็นในvariables.cbash src ก่อนหน้าsv_histsizeนี้
Brian Vandenberg

1

เพิ่มบรรทัดนั้นใน.bashrcไฟล์ของคุณ

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" \$1)}'; $PROMPT_COMMAND"

บันทึก:

เริ่มแรกฉันทำการทดสอบเบย์ส่งสัญญาณ USR1 ไปที่ทุบตีด้วย killall หลังจากนั้นฉันคิดว่าจะใช้ชื่อกระสุนที่ไม่ซ้ำกันสำเนา bash ชื่อ testshell เพื่อหลีกเลี่ยงการฆ่าหอยของตัวเองที่สามารถทำงานได้ (กระบวนการ cron เป็นต้น) การทำงาน

Killall ไม่ได้เลือกมากพอฉันแทนที่มันด้วยสคริปต์ที่ฆ่าเฉพาะกระบวนการทุบตีที่แน่นถึง tty ( ps aรายงานกระบวนการที่เชื่อมโยงกับ tty เท่านั้น)

อย่าลืมรีสตาร์ทเซสชันของคุณเพื่อรับ PROMPT_COMMAND ใหม่เมื่อฉันทดสอบฉันเห็นการทดสอบก่อนหน้าของฉันหลายชุดซ้อนกันภายใน PROMPT_COMMAND


คุณไม่ต้องการผู้ใช้ใหม่และเชลล์ตัวอื่นคุณสามารถบอกkillallให้ส่งสัญญาณไปยังกระบวนการของผู้ใช้รายเดียวกันโดยมี-uอาร์กิวเมนต์เพิ่มเติม, e.g. -u $ (whoami) `
Philipp Wendler

ฉันคิดว่าซินแทกซ์สำหรับ csh ผิด ... @Phippippend คุณช่วยอธิบายหน่อยได้ไหม?
lucacerone

คำถามเกี่ยวกับ bash ดังนั้นฉันจึงใช้ไวยากรณ์ bash ฉันไม่รู้ csh สำหรับ bash killall -q -USR1 -u $(whoami) bashส่งสัญญาณ USR1 ไปยังกระบวนการ bash ทั้งหมดของผู้ใช้ปัจจุบัน
Philipp Wendler

@Philipp ty btw ฉันไม่ได้ทดสอบโซลูชันเชลล์โดยเฉพาะมันเป็นการแก้ไขกรณีที่ cron bash script จะทำงาน
Emmanuel

@LucaCerone ผมเขียนโค้ดดูเหมือนว่าจะทำงาน
เอ็มมานู

0

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


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