Làm thế nào !! làm việc trong bash?


34

Rất hữu ích khi bạn quên một sudo ở đầu lệnh của bạn, !!hoạt động như một bí danh của lệnh trước đó. Thí dụ :

$ mv /very/long/path/for/a/protected/sensible/file/caution.h .
(...) Permission denined
$ sudo !!
sudo mv /very/long/path/for(...) .
[sudo] password :
  • Làm thế nào để chúng ta gọi đó là !!lừa đôi ? Các nghiên cứu qua internet rất khó khăn vì mã thông báo đó.
  • Làm thế nào nó hoạt động ? Tôi nghi ngờ một liên kết với lệnh lịch sử.
  • Nó được định nghĩa ở đâu? Tôi có thể tự định nghĩa một số khác?

EDIT: Một số nhà thiết kế sự kiện thú vị

!!:*

Nó đề cập đến các đối số của lệnh trước đó. Trường hợp sử dụng:

cat /a/file/to/read/with/long/path
nano !!:*

:p

Chỉ cần in lệnh mà không thực hiện nó, bạn phải đặt nó ở cuối trình chỉ định sự kiện.

$ !-5:p
sudo rm /etc/fstab -f

Thêm ở đây .


3
Đọcman history
Costas

1
Đó là một trường hợp đặc biệt của việc mở rộng lịch sử, trong đó trình bao cố gắng mở rộng một từ bắt đầu bằng !một lệnh khớp trong danh sách lịch sử của trình bao hiện tại. !!là trường hợp đặc biệt, tương đương với !-1, trong đó một số âm ntheo sau !chỉ đến lệnh thứ n trước.
chepner

1
@Costas, hữu ích hơn, đọc LESS='+/^HISTORY EXPANSION' man bash.
tự đại diện

Câu trả lời:


34

!!được liệt kê trong bashhướng dẫn dưới tiêu đề "Nhà thiết kế sự kiện":

   An event designator is a reference to a command line  entry  in  the
   history 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 posi-
          tion in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current  posi-
          tion  in  the history list containing string.  The trailing ?
          may be omitted if string is followed immediately  by  a  new-
          line.
   ^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.

Vì vậy, !!sẽ được thay thế bằng lệnh trước đó.

Lưu ý rằng lịch sử shell sẽ không chứa chữ !!mà thay vào đó là lệnh thực tế đã được thực thi:

$ ls
[some output]

$ !! .
[same output]

$ history 3
  645  2016-08-25 17:40:55 ls
  646  2016-08-25 17:40:57 ls .
  647  2016-08-25 17:41:00 history 3
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.