Bash: Số lịch sử Số lượt so với số thứ tự


11

Trong khi Googling cách tùy chỉnh dấu nhắc shell của tôi thông qua biến PS1, tôi thấy các bảng ký tự đặc biệt có thể được sử dụng. Đặc biệt:

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

"Số lịch sử" dường như được sử dụng phổ biến hơn và tôi biết cách sử dụng các lệnh như !523để làm lại các lệnh từ lịch sử. Nhưng tôi không thể tìm ra nếu "số lệnh" có chức năng tương tự. Tôi đã thử đặt \#biến PS1 của mình và dường như xuất ra số lượng lệnh được nhập trong một phiên cụ thể (không giống như \!, vẫn tồn tại sau khi đăng xuất / thoát).

Bất cứ ai cũng biết cách sử dụng "số lệnh" một cách thuận tiện hoặc có ý nghĩa?


2
Tôi đã tìm kiếm khá sâu trên mạng - gần như tôi có thể nói, "số lệnh" này chỉ có giá trị khi nó cho bạn biết bạn đã nhập bao nhiêu lệnh. Tôi không thể tìm ra cách sử dụng số này một cách tương tác, như với việc mở rộng lịch sử
Lagrangian

1
Câu hỏi thú vị. Nếu bạn đưa ra nhận xét đó là câu trả lời, tôi sẽ bỏ phiếu cho nó.
Peter Cordes

Câu trả lời:


1

Số lệnh của Bash chỉ để hiển thị.

Đầu tiên, một số nền tảng từ bashref:

Số lệnh và số lịch sử thường khác nhau: số lịch sử của lệnh là vị trí của nó trong danh sách lịch sử, có thể bao gồm các lệnh được khôi phục từ tệp lịch sử (* lưu ý Bash History Tiện ích: :), trong khi số lệnh là vị trí trong chuỗi các lệnh được thực thi trong phiên shell hiện tại.

Lặn qua nguồn, parse.ychúng ta thấy rằng nó phân '\#'giải thành biến tĩnh toàn cục 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;                                                            

vốn chỉ có một cách sử dụng khác: trong eval.c, nó tăng lên khi chạy lệnh:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Tất cả những gì được giữ là một số, không phải là lệnh thực tế hoặc thậm chí là số lịch sử tương đương. Vì vậy, khi thực hiện từng lệnh, bash quên lệnh nào được liên kết với số lệnh nào, khiến số lệnh không thể sử dụng cho bất kỳ thứ gì ngoài tham chiếu hiển thị và cuộn.


5

Theo như tôi có thể nói (và điều này dường như được xác nhận bởi nghiên cứu của bạn), không có cách nào để đề cập đến con số ma thuật đó một cách tương tác, hoặc không thông qua fchoặc các !nphím tắt. Những cái đó dường như chỉ đề cập đến vị trí tuyệt đối trong danh sách lịch sử, chứ không phải vị trí tương đối kể từ khi lớp vỏ cụ thể này bắt đầu (mà waht \#đề cập đến, như bạn đã chỉ ra một cách chính xác).

Cách duy nhất tôi tìm thấy để làm cho cái này đẹp hơn ở đây là đặt như sau:

export HISTFILESIZE=1001
export HISTSIZE=-1

Theo cách đó:

  1. lịch sử của phiên mới bắt đầu vào lúc 1000, điều này giúp dễ dàng xác định nơi tôi đang ở trong phiên
  2. (hơi không liên quan) tôi không bị mất lịch sử cũ trong một phiên nhất định (nhưng vẫn không làm ngập tệp)

Về cơ bản, nó đã biến dấu nhắc sửa đổi ( PS1="\\!$ ") của tôi từ:

499$ 

đến:

1000$ 

... Làm cho nó sạch hơn một chút khi bắt đầu. Nhưng đó có lẽ không phải là câu trả lời bạn đang tìm kiếm. :)

(Nhân tiện, tôi cũng đã xem zsh để tìm giải pháp và có vẻ như nó đơn giản là không có tương đương \#, vì vậy điều đó cũng không giúp được gì cả.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.