Apa yang dilakukan “apt-get install !!” dan bagaimana membuatnya bekerja?

54

Saya telah melihat seseorang mengetik

apt-get install !!

Dia melakukan itu beberapa kali dan setiap kali, program yang berbeda diinstal. Sepertinya secara otomatis tahu apa yang dibutuhkan selanjutnya.

Namun, ketika saya mencobanya di mesin virtual Ubuntu 14.04.1 LTS saya, itu hanya menunjukkan beberapa petunjuk penggunaan. Googling untuk apt-get install !!sepertinya tidak berfungsi dengan baik. Banyak hasil pencarian tidak mengandung tanda seru ganda.

Apa yang apt-get install !!dilakukan dan apa yang bisa hilang pada mesin saya yang tidak berfungsi?

Thomas Weller
sumber
1
Lihat juga: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Jawaban:

74

!! adalah jalan pintas dalam bash yang berarti perintah terakhir dijalankan.

Coba ini:

 echo hello
 !!

Dalam konteks ini, !!akan diperluas ke yang lain echo hello.

Saya membayangkan apa yang terjadi adalah mereka mencoba menjalankan perintah dan gagal dan mengeluh itu tidak diinstal. Maka mereka mengetik sudo apt-get install !!karena nama paket itu kebetulan sama dengan nama perintah yang mereka coba jalankan. Perintah yang dihasilkan akan mencoba untuk menginstal paket dengan nama yang sama dengan perintah yang baru saja mereka coba jalankan.

Stephen
sumber
10
Ya, mungkin itu. Jika saya menjalankan lynx, lihat bahwa itu tidak diinstal dan kemudian jalankan apt-get install !!menginstal lynx. Itu tidak berhasil untuk saya, karena saya mencoba apt-get install !!sebagai satu-satunya perintah.
Thomas Weller
4
Penggunaan umum lainnya adalah ketika sesuatu seharusnya dijalankan seperti sudo, misalnya apt-get installsesuatu.
MBraedley
6
@AL: Anda mengetik pertama kali apt-get install some-program, dan ketika Anda menyadari bahwa Anda tidak memiliki hak istimewa, Anda hanya sudo !!, yang memperluas ke sudo apt-get install some-program.
mgarciaisaia
3
!!adalah alias untuk !-1, artinya item terakhir dalam sejarah bash. !-2adalah kedua dari belakang dan sebagainya.
Tim
41

!!tidak ada hubungannya dengan apt-get. Ini adalah kata kunci shell yang akan diperluas ke perintah sebelumnya. Ekspansi ini dilakukan oleh shell sebelum perintah saat ini ditafsirkan.

Dari man bash:

!! Lihat perintah sebelumnya. Ini adalah sinonim untuk `! -1 '.

Misalnya, jika Anda menjalankan perintah:

echo "foo"

Maka jika Anda menjalankan:

sudo apt-get install !!

itu akan diperluas ke:

sudo apt-get install echo foo

Seperti yang Anda lihat itu diperluas menjadi dua paket yaitu echodan yang lainnya foo. Tidak ada paket mandiri bernama foodan echo. Terlepas dari shell builtin echoada /bin/echoexecutable yang merupakan bagian dari paket GNU-coreutils. Jadi, Anda akan mendapatkan kesalahan dengan mengatakan bahwa tidak ada paket yang tersedia.

Di sisi lain orang lain mungkin melakukan sesuatu seperti ini:

$ cowsay
The program 'cowsay' is currently not installed. You can install it by typing:
sudo apt-get install cowsay

$ sudo apt-get install !!
sudo apt-get install cowsay
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  filters
The following NEW packages will be installed:
  cowsay
0 upgraded, 1 newly installed, 0 to remove and 119 not upgraded.
Need to get 18.5 kB of archives.

Seperti yang Anda lihat cowsaysedang diinstal.

Saya menyarankan Anda untuk tidak melakukan ini (kecuali Anda yakin), menjadi eksplisit tidak membahayakan.

heemayl
sumber
2
Penjelasan bagus untuk !!. Saya tahu apa artinya, tapi saya suka cara Anda menggambarkannya.
Terrance
1
+1 untuk peringatan agar tidak mencoba ini di rumah.
Shadur
16

!!: Lihat perintah sebelumnya. Ini adalah sinonim untuk !-1( Sumber ).

Misalnya, jika saya menjalankan:

./test

lalu ingat bahwa saya harus menjadi Root, maka saya cukup mengetik:

sudo !!

itu sama dengan mengetik:

sudo ./test

Ini berguna ketika perintah terakhir Anda mengandung banyak karakter.

Bilal
sumber
1
Cemerlang! Saya tidak pernah memikirkan sudo !!perintah itu; apa yang telah saya lakukan selama bertahun-tahun adalah tekan tombol atas sekali, lalu gerakkan kursor ke kiri dan tambahkan sudo.
IQAndreas
1
@IQAndreas Cara Anda memberi Anda kesempatan untuk memeriksa ulang perintah, yang bukan merupakan hal yang buruk saat dijalankan sudo.
Matt Nordhoff
1
Saya selalu membaca "sudo !!" sebagai "i mean sudo for f *** sake"
Viktor Mellgren
1
@Vixen: Dalam hal ini, si brengsek itu juga bisa menjadi sesuatu untuk Anda
Thomas Weller
@IQAndreas memindahkan kursor ke kiri sepertinya terlalu membosankan. Kenapa tidak adil Ctrl+Aatau setidaknya Home?
Ruslan
2

Pertanyaannya sudah dijawab, jadi saya tidak akan berulang. Namun, saya ingin menunjukkan bahwa ada banyak cara pintas seperti itu di berbagai shell yang membantu mengulang / menemukan / mengedit perintah. Beberapa yang saya gunakan adalah:

  1. !$diikuti oleh ENTERakan mengetik kata terakhir dari perintah terakhir. Sebagai contoh,

    ls -l /let/me/in
    cd !$

Ini akan membuat Anda masuk /let/me/in

  1. Ctrl- Rdan kemudian ketikkan beberapa kata dari perintah sebelumnya. Misalnya, jika Anda mengetik vi /home/mycoolproject.shdan diikuti dengan beberapa perintah acak seperti ls, cd, pwd, dll maka hanya mengetik Ctrl- Rdiikuti oleh coolakan menarik bahwa viperintah.

Cukup cari pintasan keyboard bash (atau csh atau apa pun) dan itu akan menjadi hal terbaik yang Anda lakukan hari ini!

Melompat Kelinci
sumber