Tôi mới biết rằng Linux có một sudo !!
lệnh áp dụng theo nghĩa đen sudo
cho lệnh được nhập cuối cùng. Tôi chưa bao giờ nghe về nó.
Đó có phải là một kiểm soát chung? Tôi có thể tìm tài liệu về nó ở đâu?
Tôi mới biết rằng Linux có một sudo !!
lệnh áp dụng theo nghĩa đen sudo
cho lệnh được nhập cuối cùng. Tôi chưa bao giờ nghe về nó.
Đó có phải là một kiểm soát chung? Tôi có thể tìm tài liệu về nó ở đâu?
Câu trả lời:
Đây chỉ là phím tắt bash. Nhân tiện, nó không phải sudo!!
vậy. Đó là sudo !!
(lưu ý không gian).
Các !!
trong bash cơ bản là một mở rộng của lệnh trước đó.
Hãy xem phần "Mở rộng lịch sử" của trang bash man:
http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators
Nó thực sự sudo !!
, trong đó bao gồm các lệnh sudo
, mà bạn có thể quen, và một vấn thiết kế sự kiện , !!
, trong đó đề cập đến lệnh cuối cùng bước vào. Bạn có thể tìm thấy nhiều hơn trong bash
trang người đàn ông, dưới Event Designators
phần.
Event Designators
An event designator is a reference to a command line entry in the his‐
tory list. Unless the reference is absolute, events are relative to
the current position in the history list.
! Start a history substitution, except when followed by a blank,
newline, carriage return, = or ( (when the extglob shell option
is enabled using the shopt builtin).
!n Refer to command line n.
!-n Refer to the current command minus n.
!! Refer to the previous command. This is a synonym for `!-1'.
!string
Refer to the most recent command preceding the current position
in the history list starting with string.
!?string[?]
Refer to the most recent command preceding the current postition
in the history list containing string. The trailing ? may be
omitted if string is followed immediately by a newline.
^string1^string2^
Quick substitution. Repeat the previous command, replacing
string1 with string2. Equivalent to ``!!:s/string1/string2/''
(see Modifiers below).
!# The entire command line typed so far.
Sự tách biệt chức năng này là một trong những nguyên tắc thiết kế đẹp nhất làm cho Linux / Unix mạnh hơn rất nhiều so với các lựa chọn thay thế khác trong đó mỗi chương trình là một đảo quy ước và khả năng độc lập riêng biệt.
"làm cho mỗi chương trình làm một việc, và làm tốt"
Thay vì thực hiện !! bên trong sudo (hoặc bất kỳ lệnh nào khác) có thể hưởng lợi từ việc lặp lại lệnh trước đó - nó được thực hiện một lần (trong shell) và tất cả các lệnh có thể được hưởng lợi từ nó. Vì vậy, bạn có thể làm:
$ echo !! # will echo the last command
$ time !! # will repeat and time the last command
$ strace !! # will repeat the last program while system-call tracing it
vân vân
Nhưng nó không kết thúc ở đây. Shell làm nhiều hơn là mở rộng lịch sử thông qua! người chỉ định sự kiện. Trước khi thực hiện lệnh của bạn, nó thực hiện mở rộng biến, mở rộng ký tự đại diện tên tệp (globalbing), thay thế lệnh, chuyển hướng tệp / IO, và nhiều hơn nữa. Tất cả đều có thể được tận dụng và sử dụng trong bất kỳ lệnh nào được gọi từ shell.
Một lợi thế lớn khác là nếu bạn dành thời gian học vỏ của mình ('man bash' trong trường hợp này), bạn cần học nó một lần và bạn có thể sử dụng những khả năng mạnh mẽ này mọi lúc, mọi nơi. Việc tìm hiểu một tập hợp các nguyên tắc và quy ước mạnh mẽ sẽ dễ dàng hơn nhiều, thay vì học lại cách xử lý dòng lệnh trong mỗi chương trình hoặc tiện ích.