Những gì apt apt-get cài đặt !! Hãy làm gì và làm thế nào để nó hoạt động?


54

Tôi đã thấy ai đó gõ

apt-get install !!

Ông đã làm điều đó một vài lần và mỗi lần, một chương trình khác nhau đã được cài đặt. Có vẻ như nó tự động tìm ra những gì cần thiết tiếp theo.

Tuy nhiên, khi tôi dùng thử trên máy ảo Ubuntu 14.04.1 LTS của mình, nó chỉ hiển thị một số hướng dẫn sử dụng. Googling cho apt-get install !!dường như không hoạt động rất tốt. Nhiều kết quả tìm kiếm không chứa dấu chấm than kép.

Điều gì apt-get install !!làm và những gì có thể thiếu trên máy của tôi mà nó không hoạt động?


Câu trả lời:


74

!! là một phím tắt trong bash có nghĩa là lệnh cuối cùng được thực thi.

Thử đi:

 echo hello
 !!

Trong bối cảnh này, !!sẽ được mở rộng sang khác echo hello.

Tôi tưởng tượng những gì đã xảy ra là họ đã cố chạy một lệnh và nó đã thất bại và phàn nàn rằng nó không được cài đặt. Vì vậy, sau đó họ gõ sudo apt-get install !!vì tên gói trùng khớp với tên của lệnh mà họ đã cố chạy. Lệnh kết quả sẽ cố gắng cài đặt một gói có cùng tên với lệnh mà họ vừa cố thực hiện.


10
Vâng, đó có lẽ là nó. Nếu tôi chạy lynx, thấy rằng nó chưa được cài đặt và sau đó chạy apt-get install !!nó sẽ cài đặt lynx. Nó không làm việc cho tôi, vì tôi đã cố gắng apt-get install !!như là lệnh duy nhất.
Thomas Weller

4
Một cách sử dụng phổ biến khác là khi một cái gì đó nên được chạy như sudo, chẳng hạn như apt-get installing một cái gì đó.
MBraedley

6
@AL: bạn nhập loại đầu tiên apt-get install some-programvà khi bạn nhận ra mình không có đặc quyền, bạn chỉ cần sudo !!mở rộng ra sudo apt-get install some-program.
mgarciaisaia

3
!!là một bí danh cho !-1, có nghĩa là mục cuối cùng trong lịch sử bash. !-2là áp chót và như vậy.
Tim

41

!!không có gì để làm với apt-get. Nó là một từ khóa shell sẽ được mở rộng cho lệnh trước đó. Việc mở rộng này được thực hiện bằng shell trước khi lệnh hiện tại được diễn giải.

Từ man bash:

!! Tham khảo lệnh trước. Đây là một từ đồng nghĩa với `! -1 '.

Ví dụ: nếu bạn chạy một lệnh:

echo "foo"

Sau đó, nếu bạn chạy:

sudo apt-get install !!

nó sẽ được mở rộng thành:

sudo apt-get install echo foo

Như bạn có thể thấy nó được mở rộng thành hai gói cụ thể echovà gói kia là foo. Không có gói độc lập có tên fooecho. Ngoài shell dựng sẵn, echocó thể /bin/echothực thi được là một phần của gói GNU-coreutils. Vì vậy, bạn sẽ nhận được lỗi nói rằng không có gói như vậy có sẵn.

Mặt khác, người khác có thể đang làm một cái gì đó như thế này:

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

Như bạn có thể thấy cowsayđang được cài đặt.

Tôi sẽ đề nghị bạn không làm điều này (trừ khi bạn chắc chắn), rõ ràng không gây hại.


2
Giải thích tuyệt vời cho !!. Tôi biết ý nghĩa của nó, nhưng tôi thích cách bạn mô tả nó.
Terrance

1
+1 cho cảnh báo không thử điều này ở nhà.
Shadur

16

!!: Tham khảo lệnh trước. Đây là một từ đồng nghĩa với !-1( Nguồn ).

Chẳng hạn, nếu tôi thực thi:

./test

sau đó hãy nhớ rằng tôi cần phải là Root, sau đó tôi có thể chỉ cần gõ:

sudo !!

Nó giống như gõ:

sudo ./test

Nó hữu ích khi lệnh cuối cùng của bạn chứa rất nhiều ký tự.


1
Xuất sắc! Tôi chưa bao giờ nghĩ về sudo !!mệnh lệnh; những gì tôi đã làm trong nhiều năm là nhấn phím lên một lần, sau đó di chuyển con trỏ sang bên trái và thêm sudo.
IQAndreas

1
@IQAndreas Cách của bạn cho bạn cơ hội kiểm tra lại lệnh, đây không phải là điều xấu khi chạy sudo.
Matt Nordhoff

1
Tôi luôn đọc "sudo !!" như "ý tôi là sudo cho f *** sake"
Viktor Mellgren

1
@Vixen: Trong trường hợp đó, thefuck cũng có thể là thứ dành cho bạn
Thomas Weller

@IQAndreas di chuyển con trỏ sang bên trái có vẻ quá nhàm chán. Tại sao không chỉ Ctrl+Ahoặc ít nhất Home?
Ruslan

2

Câu hỏi đã được trả lời, vì vậy tôi sẽ không lặp lại. Tuy nhiên, tôi muốn chỉ ra rằng có rất nhiều phím tắt như vậy trong các shell khác nhau giúp lặp lại / tìm / chỉnh sửa các lệnh. Một số trong những cái tôi sử dụng là:

  1. !$theo sau ENTERsẽ gõ từ cuối cùng của lệnh cuối cùng. Ví dụ,

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

Điều này sẽ đưa bạn vào /let/me/in

  1. Ctrl- Rvà sau đó nhập một vài từ từ một lệnh trước đó. Ví dụ, nếu bạn gõ vi /home/mycoolproject.shvà sau đó nó lên với một số lệnh ngẫu nhiên như ls, cd, pwd, vv sau đó chỉ cần gõ Ctrl- Rtiếp theo coolsẽ kéo lên rằng vilệnh.

Chỉ cần tìm kiếm các phím tắt bash (hoặc csh hoặc bất cứ thứ gì) và đó sẽ là điều tốt nhất bạn đã làm hôm nay!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.