Bash: “geçmiş numarası” ve “komut numarası”


11

Googling, kabuk istemimi PS1 değişkeni ile nasıl özelleştireceğimizi kullanırken, kullanılabilecek özel karakter tablolarını görüyorum. Özellikle:

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

"Tarih numarası" daha sık kullanılan gibi görünüyor ve ben !523komutları tarihe yeniden yapmak gibi komutları kullanmayı biliyorum . Ancak "komut numarası" nın benzer bir işlevselliğe sahip olup olmadığını anlayamıyorum. \#PS1 değişkenimi koyarak denedim ve belirli bir oturumda girilen komutların sayısını çıktı gibi görünüyor (aksine \!, hangi çıkış / çıkış sonra devam ediyor).

Herkes "komut numarası" uygun veya anlamlı bir şekilde kullanmayı biliyor mu?


2
Oldukça net bir şekilde derinlemesine araştırdım - anlayabildiğim kadarıyla, bu "komut numarası" sadece kaç komut girdiğinizi söylediği sürece değerlidir. Tarihin genişlemesinde olduğu gibi bu sayıyı etkileşimli olarak kullanmanın bir yolunu bulamıyorum
Lagrangian

1
İlginç soru. Eğer bu yorumu bir cevap yaparsanız, oy vermek isterim.
Peter Cordes

Yanıtlar:


1

Bash'ın komut numarası yalnızca görüntüleme içindir.

İlk olarak, bazı arka plan bilgileri bashref:

Komut numarası ve geçmiş numarası genellikle farklıdır: bir komutun geçmiş numarası, geçmiş listesindeki konumudur ve geçmiş dosyasından geri yüklenen komutları içerebilir (* not Bash History Facilities: :), komut numarası ise geçerli kabuk oturumu sırasında yürütülen komutlar sırasındaki konum.

Kaynakta dalmak , küresel statik değişkene çözüm parse.yolduğunu görüyoruz :'\#'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;                                                            

sadece bir başka kullanımı vardır: içinde eval.c, bir komut çalıştırıldığında artar:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Saklanan tek şey bir sayıdır, gerçek komut veya hatta eşdeğer geçmiş numarası değildir. Bu nedenle, her komutun çalıştırılmasından sonra bash, hangi komut numarası ile ilişkili olan komutu unutur ve komut numarasını görüntüleme ve kaydırma referansı dışında herhangi bir şey için kullanılamaz hale getirir.


5

Anlayabildiğim kadarıyla (ve bu araştırmanız tarafından onaylanmış görünüyor), bu sihirli sayıya etkileşimli olarak fcveya !nkısayollarla değil, interaktif olarak atıfta bulunmanın bir yolu yoktur . Bunlar kesinlikle bu özel kabuk başladığından bu yana, göreceli pozisyona değil, sadece tarih listesindeki mutlak pozisyona atıfta bulunurlar ( \#doğru bir şekilde işaret ettiğiniz gibi).

Bu güzel yapmak için buldum tek yolu, aşağıdaki ayarlamaktır:

export HISTFILESIZE=1001
export HISTSIZE=-1

Bu şekilde:

  1. yeni bir oturumun tarihi başlar 1000, bu da oturumda nerede olduğumu tanımlamayı kolaylaştırır
  2. (biraz ilgisiz) belirli bir oturumda eski geçmişini kaybetmiyorum (ama yine de dosyayı sel etmeyin)

Temel olarak, değiştirilmiş istemimi ( PS1="\\!$ ") şu kaynaktan çevirdi :

499$ 

için:

1000$ 

... başlangıçta biraz daha temiz yapar. Ama muhtemelen aradığınız cevap bu değil. :)

(Bu arada, bir çözüm için zsh'a da baktım ve bunun eşdeğeri yok gibi görünüyor \#, bu yüzden de yardımcı olmuyor.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.