Penggantian terminal! diikuti oleh angka dengan perintah

12

Saya sangat bingung tentang sesi terminal ubuntu saya, sepertinya untuk mengganti bagian dalam perintah yang dimulai dengan !diikuti oleh nomor dengan perintah yang tampaknya acak. Itu melakukannya dengan !87menggantinya dengan screen -ldan juga dengan !88dan menggantinya dengan ls.

Setiap ide mengapa ini terjadi akan sangat dihargai.

usbpc102
sumber

Jawaban:

20

Itu bashekspansi sejarah, misalnya

!87

menjalankan kembali perintah dari baris sejarah 87.

Anda menemukan deskripsi fitur ini di man bash, bagian "SEJARAH EKSPANSI":

       An  event  designator  is  a  reference  to a command line entry in the
       history list.  Unless the reference is absolute, events are relative to
       the current position in the history list.

       !      Start  a  history substitution, except when followed by a blank,
              newline, carriage return, = or ( (when the extglob shell  option
              is enabled using the shopt builtin).
       !n     Refer to command line n.
       !-n    Refer to the current command minus n.

Jadi untuk segera memanggil perintah terakhir, lakukan !-1dan untuk perintah terakhir kelima !-5. Sinonim yang berguna untuk !-1adalah !!- jika Anda memanggil mis apt install somethingdan lupa sudo, jalankan saja sudo !!dan Anda baik-baik saja.

Hanya backslash ( \ ) dan tanda kutip tunggal yang dapat mengutip karakter ekspansi sejarah.

Untuk menghindari ekspansi riwayat, Anda harus keluar dari tanda seru dengan garis miring terbalik ( \!) atau menggunakan tanda kutip tunggal ( '!').

pencuci mulut
sumber
3
untuk meneruskan litere !ke perintah Anda dan menghindari ekspansi riwayat, Anda perlu mengutip satu atau menghindarinya: foo '!87'atau foo \!87. (tanda kutip ganda juga akan melakukan ekspansi pada isinya.)
quixotic