"apt-get install !!" ทำอะไรและทำอย่างไรจึงจะทำงานได้?


54

ฉันเห็นคนกำลังพิมพ์

apt-get install !!

เขาทำอย่างนั้นสองสามครั้งและทุกครั้งที่มีการติดตั้งโปรแกรมอื่น ดูเหมือนว่าจะหาสิ่งที่ต้องการโดยอัตโนมัติต่อไป

อย่างไรก็ตามเมื่อฉันลองบนเครื่องเสมือน Ubuntu 14.04.1 LTS ของฉันมันเพิ่งแสดงคำแนะนำการใช้งาน Google apt-get install !!ดูเหมือนจะทำงานได้ไม่ดีนัก ผลการค้นหาหลายรายการไม่มีเครื่องหมายอัศเจรีย์คู่

สิ่งที่apt-get install !!ต้องทำและสิ่งที่อาจขาดหายไปในเครื่องของฉันที่ใช้ไม่ได้


1
ดูเพิ่มเติมที่: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

คำตอบ:


74

!! เป็นทางลัดใน bash ที่หมายถึงคำสั่งที่เรียกใช้งานครั้งสุดท้าย

ลองสิ่งนี้:

 echo hello
 !!

ในบริบทนี้จะขยายไปยังอีก!!echo hello

ฉันคิดว่าเกิดอะไรขึ้นพวกเขาพยายามเรียกใช้คำสั่งและล้มเหลวและบ่นว่าไม่ได้ติดตั้ง ดังนั้นพวกเขาจึงพิมพ์sudo apt-get install !!เพราะชื่อแพคเกจบังเอิญเหมือนกันกับชื่อของคำสั่งที่พวกเขาพยายามเรียกใช้ คำสั่งผลลัพธ์จะพยายามติดตั้งแพ็กเกจด้วยชื่อเดียวกับคำสั่งที่พวกเขาเพิ่งพยายามเรียกใช้งาน


10
ใช่มันอาจเป็นไปได้ ถ้าฉันเรียกใช้lynxดูว่ามันไม่ได้ติดตั้งแล้วเรียกใช้apt-get install !!มันติดตั้ง lynx มันไม่ทำงานสำหรับฉันเพราะฉันพยายามapt-get install !!เป็นคำสั่งเดียว
โทมัสเวลเลอร์

4
การใช้งานทั่วไปอีกอย่างหนึ่งก็คือเมื่อบางสิ่งบางอย่างควรถูกเรียกใช้sudoเช่นapt-get installไอเอ็นจีบางสิ่ง
MBraedley

6
@AL: คุณชนิดแรกapt-get install some-programและเมื่อคุณรู้ว่าคุณมีสิทธิ์ไม่เพียงแค่คุณซึ่งจะขยายsudo !! sudo apt-get install some-program
mgarciaisaia

3
!!เป็นนามแฝงสำหรับ!-1หมายถึงรายการสุดท้ายในประวัติทุบตี !-2เป็นสุดท้ายและอื่น ๆ
ทิม

41

!!apt-getมีอะไรจะทำอย่างไรกับ เป็นคีย์เวิร์ดเชลล์ที่จะถูกขยายไปยังคำสั่งก่อนหน้า การขยายตัวนี้ทำโดยเชลล์ก่อนคำสั่งปัจจุบันจะถูกตีความ

จากman bash:

!! อ้างถึงคำสั่งก่อนหน้า นี่คือคำพ้องสำหรับ `! -1 '

ตัวอย่างเช่นหากคุณรันคำสั่ง:

echo "foo"

ถ้าคุณเรียกใช้:

sudo apt-get install !!

มันจะถูกขยายเป็น:

sudo apt-get install echo foo

ในขณะที่คุณสามารถเห็นมันขยายออกเป็นสองแพคเกจคือechoและอื่น ๆ fooคือ ไม่มีแพคเกจแบบสแตนด์อโลนชื่อเป็นและfoo echoนอกเหนือจากตัวเชลล์ในตัวechoแล้วยังมี/bin/echoไฟล์ปฏิบัติการที่เป็นส่วนหนึ่งของแพ็คเกจ GNU-coreutils ดังนั้นคุณจะได้รับข้อผิดพลาดที่บอกว่าไม่มีแพ็คเกจดังกล่าว

ในทางกลับกันบุคคลอื่นอาจทำสิ่งนี้:

$ 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.

อย่างที่คุณเห็นcowsayกำลังติดตั้งอยู่

ฉันขอแนะนำให้คุณไม่ทำเช่นนี้ (เว้นแต่คุณจะแน่ใจ) การมีความชัดเจนไม่เป็นอันตราย


2
!!คำอธิบายที่ดีสำหรับ ฉันรู้ว่ามันหมายถึงอะไร แต่ฉันชอบวิธีที่คุณอธิบาย
Terrance

1
+1 สำหรับคำเตือนไม่ให้ลองทำที่บ้าน
Shadur

16

!!: อ้างถึงคำสั่งก่อนหน้า นี่คือคำพ้องความหมายสำหรับ!-1( แหล่งที่มา )

ตัวอย่างเช่นถ้าฉันดำเนินการ:

./test

จากนั้นจำไว้ว่าฉันต้องเป็นรูทแล้วฉันก็พิมพ์ได้:

sudo !!

มันเหมือนกับการพิมพ์:

sudo ./test

มีประโยชน์เมื่อคำสั่งสุดท้ายของคุณมีอักขระจำนวนมาก


1
ยอดเยี่ยม! ฉันไม่เคยคิดถึงsudo !!คำสั่ง; sudoสิ่งที่ผมได้ทำมานานหลายปีคือการกดปุ่มขึ้นครั้งแล้วเลื่อนเคอร์เซอร์ไปตลอดทางไปทางซ้ายและเพิ่ม
IQAndreas

1
@IQAndreas sudoวิธีที่จะช่วยให้คุณมีโอกาสที่จะตรวจสอบคำสั่งซึ่งไม่ได้เป็นสิ่งที่ไม่ดีเมื่อทำงาน
Matt Nordhoff

1
ฉันมักจะอ่าน "sudo !!" ในขณะที่ "ฉันหมายถึง sudo เพื่อ f *** sake"
Viktor Mellgren

1
@Vixen: ในกรณีนั้นthefuckก็อาจเป็นของคุณได้ด้วย
Thomas Weller

@IQA การเลื่อนเคอร์เซอร์ไปทางซ้ายจนสุดน่าเบื่อเกินไป ทำไมไม่เพียงCtrl+Aหรืออย่างน้อยHome?
Ruslan

2

คำถามได้ถูกตอบแล้วดังนั้นฉันจะไม่พูดซ้ำ อย่างไรก็ตามฉันอยากจะชี้ให้เห็นว่ามีช็อตคัทจำนวนมากในเชลล์ต่างๆที่ช่วยให้คำสั่งซ้ำ / ค้นหา / แก้ไข บางอย่างที่ฉันใช้คือ:

  1. !$ตามด้วยENTERจะพิมพ์คำสุดท้ายของคำสั่งสุดท้าย ตัวอย่างเช่น,

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

นี้จะลงจอดคุณ /let/me/in

  1. Ctrl- Rจากนั้นพิมพ์คำสองสามคำจากคำสั่งก่อนหน้า ตัวอย่างเช่นถ้าคุณพิมพ์vi /home/mycoolproject.shและตามมันขึ้นกับคำสั่งสุ่มบางอย่างเช่นls, cd, pwdฯลฯ จากนั้นเพียงแค่พิมพ์Ctrl- Rตามมาด้วยcoolจะดึงขึ้นว่าviคำสั่ง

เพียงค้นหาแป้นพิมพ์ลัด bash (หรือ csh หรืออะไรก็ตาม) และมันจะเป็นสิ่งที่ดีที่สุดที่คุณทำในวันนี้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.