Bash:“ หมายเลขประวัติ” เทียบกับ“ หมายเลขคำสั่ง”


11

ในขณะที่ Googling วิธีปรับแต่ง shell prompt ของฉันผ่านตัวแปร PS1 ฉันเห็นตารางของอักขระพิเศษที่สามารถใช้ได้ โดยเฉพาะอย่างยิ่ง:

          \!     the history number of this command
          \#     the command number of this command

ดูเหมือนว่า "หมายเลขประวัติ" จะใช้บ่อยกว่าและฉันรู้วิธีใช้คำสั่งเช่น!523ทำคำสั่งซ้ำจากประวัติ แต่ฉันไม่สามารถเข้าใจได้ว่า "หมายเลขคำสั่ง" มีฟังก์ชั่นที่คล้ายกันหรือไม่ ฉันได้ลองใส่\#ตัวแปร PS1 ของฉันแล้วและดูเหมือนว่าจะส่งออกจำนวนคำสั่งที่ป้อนในเซสชันหนึ่ง (ซึ่งต่างจาก\!ที่มีอยู่หลังจากออกจากระบบ / ออก)

ใครรู้วิธีใช้ "หมายเลขคำสั่ง" อย่างสะดวกหรือมีความหมาย?


2
ฉันค้นหาลึกมากบนเน็ต - ใกล้ที่สุดเท่าที่ฉันจะบอกได้ "หมายเลขคำสั่ง" นี้มีค่าตราบเท่าที่มันจะบอกคุณว่ามีคำสั่งกี่คำที่คุณป้อน ฉันไม่สามารถหาวิธีใช้ตัวเลขนี้แบบโต้ตอบได้เช่นเดียวกับการขยายประวัติ
Lagrangian

1
คำถามที่น่าสนใจ หากคุณแสดงความเห็นเป็นคำตอบฉันจะลงคะแนนให้
Peter Cordes

คำตอบ:


1

หมายเลขคำสั่งของ Bash ใช้สำหรับแสดงเท่านั้น

ครั้งแรกพื้นหลังบางส่วนจากbashref:

หมายเลขคำสั่งและหมายเลขประวัติมักจะแตกต่างกัน: หมายเลขประวัติของคำสั่งคือตำแหน่งในรายการประวัติซึ่งอาจรวมถึงคำสั่งที่กู้คืนจากไฟล์ประวัติ (* note Bash History Facilities: :) ในขณะที่หมายเลขคำสั่งคือ ตำแหน่งในลำดับของคำสั่งที่ดำเนินการระหว่างเซสชันเชลล์ปัจจุบัน

ดำน้ำผ่านแหล่งที่มาparse.yเราจะเห็นว่า'\#'แก้ไขตัวแปรคงที่ทั่วโลกcurrent_command_number:

case '#':                                                                     
  n = current_command_number;                                                 
  /* If we have already incremented current_command_number (PS4,              
 ${var@P}), compensate */                                                     
  if (orig_string != ps0_prompt && orig_string != ps1_prompt && orig_string != ps2_prompt)
n--;                                                                          
  temp = itos (n);                                                            
  goto add_string;                                                            

ซึ่งมีการใช้งานเพียงอย่างเดียว: ในeval.cมันจะเพิ่มขึ้นเมื่อใช้คำสั่ง:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

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


5

เท่าที่ฉันสามารถบอกได้ (และสิ่งนี้ดูเหมือนจะได้รับการยืนยันจากงานวิจัยของคุณ) ไม่มีทางที่จะอ้างถึงหมายเลขเวทย์มนตร์นั้นแบบโต้ตอบหรือไม่ผ่านfcหรือ!nทางลัด ดูเหมือนว่าจะอ้างถึงตำแหน่งที่แน่นอนในรายการประวัติไม่ใช่ตำแหน่งสัมพัทธ์ตั้งแต่เชลล์เฉพาะเริ่มต้นขึ้น (ซึ่ง\#หมายถึงเมื่อคุณชี้อย่างถูกต้อง)

วิธีเดียวที่ฉันพบว่าทำให้ nicer นี้ที่นี่คือการตั้งค่าต่อไปนี้:

export HISTFILESIZE=1001
export HISTSIZE=-1

ทางนั้น:

  1. ประวัติของเซสชันใหม่เริ่มต้นขึ้น1000ซึ่งทำให้ง่ายต่อการระบุตำแหน่งที่ฉันอยู่ในเซสชัน
  2. (ค่อนข้างไม่เกี่ยวข้อง) ฉันจะไม่สูญเสียประวัติเก่าในเซสชันที่กำหนด (แต่ก็ยังไม่ท่วมไฟล์)

โดยทั่วไปแล้วมันเปลี่ยนจากพรอมต์ที่แก้ไขของฉัน ( PS1="\\!$ ") จาก:

499$ 

ถึง:

1000$ 

... ซึ่งทำให้เริ่มสะอาดขึ้นเล็กน้อย แต่นั่นอาจไม่ใช่คำตอบที่คุณต้องการ :)

(โดยวิธีการที่ฉันยังดู zsh สำหรับวิธีการแก้ปัญหาและดูเหมือนว่ามันไม่ได้มีค่าเทียบเท่า\#ดังนั้นจึงไม่ได้ช่วยอะไรเลย)

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