Bash: "nomor sejarah" vs "nomor perintah"

11

Sementara Googling cara mengkustomisasi prompt shell saya melalui variabel PS1, saya melihat tabel karakter khusus yang dapat digunakan. Khususnya:

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

"Nomor sejarah" tampaknya lebih umum digunakan, dan saya tahu cara menggunakan perintah seperti !523mengulang perintah dari riwayat. Tapi saya tidak tahu apakah "nomor perintah" memiliki fungsi yang sama. Saya sudah mencoba memasukkan \#variabel PS1 saya, dan sepertinya mengeluarkan jumlah perintah yang dimasukkan dalam sesi tertentu (tidak seperti \!, yang tetap ada setelah keluar / keluar).

Adakah yang tahu cara menggunakan "nomor perintah" dengan cara yang nyaman atau bermakna?

Orang Lagrangian
sumber
2
Saya telah mencari cukup dalam di internet - sedekat yang saya tahu, "nomor perintah" ini hanya berharga sejauh ini memberi tahu Anda berapa banyak perintah yang Anda masukkan. Saya tidak dapat menemukan cara untuk menggunakan nomor ini secara interaktif, seperti dengan ekspansi sejarah
Lagrangian
1
Pertanyaan menarik. Jika Anda membuat komentar itu sebagai jawaban, saya akan memilihnya.
Peter Cordes

Jawaban:

1

Nomor perintah Bash hanya untuk tampilan.

Pertama, beberapa latar belakang dari bashref:

Nomor perintah dan nomor histori biasanya berbeda: nomor histori dari suatu perintah adalah posisinya dalam daftar histori, yang mungkin termasuk perintah yang dipulihkan dari file histori (* catatan Bash History Facilities: :), sedangkan nomor perintah adalah posisi dalam urutan perintah yang dijalankan selama sesi shell saat ini.

Menyelam melalui sumber, dalam parse.ykita melihat bahwa '\#'menyelesaikan ke variabel statis global 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;                                                            

yang hanya memiliki satu kegunaan lain: in eval.c, ini bertambah saat menjalankan perintah:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

Yang disimpan hanyalah angka, bukan perintah aktual atau bahkan nomor riwayat yang setara. Jadi, setelah eksekusi setiap perintah, bash lupa perintah apa yang terkait dengan nomor perintah apa, membuat nomor perintah tidak dapat digunakan untuk apa pun selain tampilan dan referensi gulir.

uskup
sumber
5

Sejauh yang saya tahu (dan ini tampaknya dikonfirmasi oleh penelitian Anda), tidak ada cara untuk merujuk pada angka ajaib itu secara interaktif, atau tidak melalui fcatau !npintasan. Yang tampaknya hanya merujuk pada posisi absolut dalam daftar sejarah, bukan posisi relatif sejak shell spesifik ini dimulai (yang \#mengacu pada, seperti yang Anda tunjukkan dengan benar).

Satu-satunya cara yang saya temukan untuk membuat ini lebih baik di sini adalah dengan mengatur yang berikut:

export HISTFILESIZE=1001
export HISTSIZE=-1

Seperti itu:

  1. riwayat sesi baru dimulai 1000, yang membuatnya lebih mudah untuk mengidentifikasi di mana saya berada dalam suatu sesi
  2. (agak tidak berhubungan) saya tidak kehilangan riwayat lama dalam sesi yang diberikan (tapi masih jangan membanjiri file)

Pada dasarnya, ini mengubah prompt saya yang dimodifikasi ( PS1="\\!$ ") dari:

499$ 

untuk:

1000$ 

... yang membuatnya sedikit lebih bersih di awal. Tapi itu mungkin bukan jawaban yang Anda cari. :)

(Ngomong-ngomong, saya juga mencari solusi untuk zsh, dan sepertinya tidak memiliki padanan \#, sehingga tidak membantu sama sekali.)

anarcat
sumber