Chạy lại lệnh tương tự nhưng với quyền root


117

Đôi khi, khi tôi chạy một lệnh, tôi không nhận thấy rằng tôi cần chạy nó với tư cách là siêu người dùng để có đủ quyền.

Có cách nào để chạy lại lệnh tương tự nhưng với tư cách là một siêu người dùng?

Câu trả lời:


196

Cách đơn giản nhất là chạy:

sudo !!

Điều này sẽ chạy lệnh cuối cùng nhưng là siêu người dùng.

Nguồn .


5
Tôi thấy điều này khá hữu ích và tôi đã không bắt gặp nó trước đây (mặc dù nó có thể là kiến ​​thức phổ biến). Tôi không thể tìm thấy nó trên trang web vì vậy tôi nghĩ rằng tôi sẽ tự trả lời nó.
Trufa

30
Bên cạnh đó, việc tự thực thi sẽ !!chạy lệnh trước đó của bạn theo lưu trong history. Ngoài ra, làm !-1, !-2và như vậy thực hiện lệnh cuối cùng của bạn, lệnh cuối cùng thứ hai, v.v. Tiện dụng!
oaskamay

6
Như một bên khác, !<command>sẽ thực hiện sự kiện cuối cùng từ ~/.bash_historyđó bắt đầu với<command>
Radu Rădeanu

1
ctrl-r cũng rất hữu ích. nó sẽ tìm kiếm ngược trong lịch sử của bạn cho các lệnh khớp với những gì bạn nhập. Điều này sẽ cho phép bạn chỉnh sửa lệnh trước khi chạy lại
KayEss

4
Cái !thứ bash ngu ngốc này được sao chép từ đó tcshđã làm tôi khó chịu hơn bao giờ hết. Dấu ngoặc kép không bảo vệ khỏi sự giải thích của !. $ foo "!bar"-> !bar: event not found.
Kaz

70

Là một tài tài, hay nói, qua, qua, qua một khác, qua giữ,, qua một tài khác, qua giữ, qua, qua, qua, qua một khác, qua, khi khác mới, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng đăng, mới đăng cam camnhập mô tả hình ảnh ở đây

câu trả lời : bạn nhập sudo !!thẳng sau đó để lặp lại lệnh trước đó với các đặc quyền leo thang.

chỉnh sửa: Hình ảnh được tìm thấy qua reddit , và nó nhại lại truyện tranh xkcd gốc của Randall Munroe.


3
xin vui lòng không có một cuộc trò chuyện ủng hộ hoặc phản đối ở đây trong các bình luận. Nếu bạn muốn thảo luận về giá trị hoặc cách khác, vui lòng sử dụng Meta. Cảm ơn.
fossfreedom

17

Bạn có thể thử phím mũi tên lên để cuộn qua các lệnh cũ của bạn và viết lại / thay đổi chúng và thêm sudovào phía trước chúng. (nút home phía trên các phím mũi tên sẽ đặt vị trí bắt đầu.)

Tôi không thích sudo !!ý tưởng này, vì đôi khi bạn thêm một lệnh khác ở giữa và không nhớ nữa.


1
May mắn thay, khi bạn thực hiện sudo !!, trình bao sẽ mở rộng !!để bạn có thể thấy lệnh nào nó đang cố chạy. Vì vậy, cuối cùng có thể sẽ khó chịu khi nhấn Ctrl-C và tìm đúng lệnh, nhưng ít nhất nó sẽ không khiến bạn bất ngờ.
Reid

4
@Reid Nó sẽ không mở rộng cho đến khi bạn nhấn enter và nếu bạn ở trong cửa sổ đó, nơi bạn không phải nhập lại mật khẩu, nó sẽ chạy mà không cần xác nhận. +1 để sử dụng lịch sử thay vì sử dụng một cách mù quáng!!
Izkata

5
@Izkata: Tôi cho rằng đó là sự thật. Tôi sử dụng zsh, vì vậy tôi chỉ cần gõ sudo !!<TAB>và nó tự động hoàn thành !!cho tôi. Bash có thể mở rộng lịch sử với M-^(đối với tôi, alt + shift + 6), nhưng điều đó ít trôi chảy hơn (mặc dù bạn có thể làm lại điều này). Ngoài ra shopt -s histverify, nó cũng làm cho nó khi bạn sử dụng mở rộng lịch sử và nhấn enter, thay vào đó, nó cung cấp cho bạn một dòng nhắc nhở khác với việc mở rộng được thực hiện để cho phép bạn xem / chỉnh sửa nó.
Reid

1
Tôi đã suy nghĩ nhiều hơn về tình huống tôi gõ một lệnh, lệnh trả về quyền đó đã bị từ chối và tôi biết tôi muốn chạy lại chính xác lệnh này nhưng như sudo, quá trình nhấn lên, về nhà, gõ sudo và cảm thấy nhiều chậm hơn với tôi Đó là cách tôi đã làm nó mãi mãi và nó chỉ cảm thấy không hiệu quả.
Trufa

@Reid: shopt -s histverifysẽ không giúp một chút nào. Hầu hết mọi người sẽ quen với việc đánh Enterhai lần. Tại thời điểm đó họ vẫn còn quá muộn để kiểm tra những gì đã xảy ra.
Frank Kuster

13

Tôi sẽ chỉ thêm một cách thay thế: ngắn như gõ sudo !!và linh hoạt hơn:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Đó chính xác là cùng số lượng tổ hợp phím (tôi tính "ctrl + A" là một ...), nhưng thêm "mũi tên lên" bạn có thể thực hiện bất kỳ lệnh nào trong lịch sử của mình.


1
ctrl + A là từ các ràng buộc emacs, bạn cũng có thể sử dụng các liên kết vi ( set -o vi). Sau đó, bạn có thể Thoát (chuyển sang chế độ lệnh) và sau đó 'I' (viết hoa 'i', chèn vào đầu dòng).
Burger Gerhard

1
@GerhardBurger: Tôi biết, nhưng thật kỳ lạ, tôi thích vi (đặc biệt là vim) để chỉnh sửa tài liệu nhiều dòng, nhưng tôi rất thích các emacs ràng buộc trong shell (phải chuyển từ lệnh sang chế độ chỉnh sửa trong shell không thực sự có ý nghĩa, imo và các phím tắt của emacs là khá đủ để sử dụng hàng ngày, ngay cả khi ít mạnh mẽ hơn)
Olivier Dulac

Đúng, tôi đã thêm nó chỉ để hoàn thiện, đối với tôi nó cũng vậy, tuy nhiên tôi thấy việc tìm kiếm với '/' rất thuận tiện;)
Gerhard Burger

@GerhardBurger: về bash "/" thông thường (ràng buộc emacs) cũng có một cách rất thuận tiện để tìm các lệnh trước bằng cách nhập một vài chữ cái sau đó 'ctrl + r' cho đến khi bạn tìm thấy nó
Olivier Dulac

7

Có một số cách để làm điều này

  • Chỉ cần nhập lại lệnh thêm sudotrước lệnh

  • Nhấn Up arrowđể nhận lệnh cuối cùng và đặt sudotrước nó.

  • Đi vào sudo !!

Việc !!mở rộng đến lệnh đã nhập cuối cùng. Bạn có thể làm những điều tương tự với những thứ khác với lịch sử dòng lệnh xem tại đây


7

Câu hỏi này có thể được khái quát thành " Chạy cùng một lệnh nhưng với một số sửa đổi ", vì một trong những quyết định thiết kế xuất sắc trong Unix, là những gì được thực hiện một lần trong shell, có thể được sử dụng bởi bất kỳ lệnh nào được gọi từ shell.

Nói cách khác, thủ thuật này không chỉ áp dụng cho sudo:

  • Lặp lại lệnh trước đó là superuser ( sudo !!)
  • Lặp lại lệnh trước đó và thời gian nó ( time !!)
  • Lặp lại lệnh trước đó với một môi trường khác ( env A=b B=z !!)
  • Lặp lại lệnh trước ( !!)

Mở rộng lịch sử (còn được gọi là thay thế lịch sử) chỉ là một tính năng hệ vỏ để giúp việc lặp lại các lệnh trước đó dễ dàng hơn (với ít lần nhấn phím hơn). Kiểm tra trang vỏ của bạn cho history expansion. Nó mô tả nhiều thủ thuật và lối tắt khác mà bạn có thể làm với lịch sử chẳng hạn:

Bạn có thể tham khảo các lệnh trước theo số:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Bạn có thể tham khảo các từ riêng lẻ trong các lệnh trước:

some-command !$     # run some-command on the last arg of previous command

Bạn cũng có thể tìm kiếm trước khi lặp lại:

!?awk               # repeat the last command including the string 'awk'

Bạn có thể tìm kiếm lịch sử và thay thế một cái gì đó bằng một cái gì đó khác:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

Và nhiều hơn nữa, vì bạn có thể kết hợp lựa chọn lệnh, lựa chọn arg, tìm kiếm và thay thế một cách độc lập.

Trang người đàn ông của bạn (trong trường hợp này man bash) là bạn của bạn.


1
sáng chói! đó nên là câu trả lời được chấp nhận
Eliran Malka

5

Tôi sử dụng zsh thay vì bash và có cái này trong ~/.zshrcđó, vì vậy hãy nhấn Alt+ Schèn sudovào đầu dòng lệnh:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Thật không may, tôi không thể theo dõi một cách để làm điều tương tự trong bash.


3
Bạn có thể dễ dàng thực hiện tương tự trong Bash bằng GNU Readline: add to your ~/.inputrc "\es":"\C-asudo "và bạn sẽ di chuyển đến đầu một dòng dài sudo sẽ được chèn vào đầu dòng khi nhấn alt-s. Khởi động lại thiết bị đầu cuối hoặc đọc lại ~/.inputrccho nó hoạt động.

2

Nếu bạn muốn làm điều đó trong một bí danh, bạn phải sử dụng alias redo='sudo $(history -p !!)'vì một số lý do.


1
su -c "!!"

Nếu bạn không có quyền root bằng chương trình sudo hoặc sudo thì không cài đặt trên hệ thống.


1

Cách tôi thích nó:

  • Mũi tên lên
  • Trang Chủ
  • "sudo"
  • Đi vào

Nhưng nó có thể dễ dàng hơn để làm "sudo !!", tùy thuộc vào bạn.

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.