Apa artinya! #: 3 artinya dalam perintah shell

29

Panduan instalasi untuk ack menyarankan untuk menginstal skrip ack menggunakan perintah ini:

curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 

Saya berasumsi bahwa !#:3pada akhirnya adalah semacam referensi balik, tetapi apa artinya? Apakah ada yang setara di zsh? Google belum membantu.

Matt Pfefferle
sumber
5
Dengan asumsi bash; man bash, kemudian cari EXPANSION SEJARAH
Jeff Schaller
1
Itu berarti kucing saya berjalan di atas keyboard pada saat yang sangat buruk.
IQAndreas
@IQAndreas: Ya, ini perintah yang valid, jadi kucing Anda harus cukup pintar untuk mengalahkan detektor pengetikan kucing . Jelas ini bukan kucing yang tidak berguna. :-) ⁠
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

32

Ini adalah sintaks khusus, diperluas oleh bash. Ini juga berfungsi untuk zsh.

Menurut halaman manual bash (bagian HISTORY EXPANSION), polanya mengembang sebagai berikut:

  • The event designator !# mengacu seluruh lini perintah diketik sejauh yangcurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :memisahkan antara penunjuk acara (hal ini seluruh baris) dan penunjuk kata (memilih sub-bagian)
  • yang designator kata 3 yang memilih ketiga kata / argumen (penghitungan kata dimulai pada nol), dalam hal ini ~/bin/ack.

Baris perintah akhir (biasanya ditampilkan sebelum dieksekusi) adalah: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Untuk detailnya, lihat manual bash atau sangat mirip dengan manual zsh

Jofel
sumber
7
Saya bertanya-tanya: siapa yang mengira fitur ini akan menjadi ide yang bagus?
Rhymoid
3
@Rhymoid, saya tidak menggunakan !#banyak, tapi !!, !$, !*, !sud:pdan banyak lainnya semua sangat berguna dan saya menggunakannya sepanjang waktu. Lihat unix.stackexchange.com/a/67/135943
Wildcard
11

Dalam bash, itu adalah substitusi sejarah (semua pergantian sejarah dimulai dengan !). Secara khusus, !#berarti segala sesuatu pada baris perintah sejauh ini, dan penambahan ': 3' berarti kata ketiga (mulai hitungan pada 0).

Jadi, perintah di atas diterjemahkan !#:3menjadi ~/bin/ack.

Brian
sumber