อย่างไร !! ทำงานในทุบตี?


34

มีประโยชน์มากเมื่อคุณลืม sudo ที่จุดเริ่มต้นของคำสั่งของคุณ!!ทำหน้าที่เหมือนนามแฝงของคำสั่งก่อนหน้า ตัวอย่าง:

$ mv /very/long/path/for/a/protected/sensible/file/caution.h .
(...) Permission denined
$ sudo !!
sudo mv /very/long/path/for(...) .
[sudo] password :
  • เราจะเรียก!!เคล็ดลับสองครั้งนั้นได้อย่างไร งานวิจัยทางอินเทอร์เน็ตนั้นยากเพราะโทเค็นนั้น
  • มันทำงานยังไง? ฉันสงสัยลิงก์ด้วยคำสั่ง history
  • มันถูกกำหนดไว้ที่ไหน? ฉันสามารถนิยามตัวเองได้ไหม

แก้ไข: นักออกแบบเหตุการณ์ที่น่าสนใจ

!!:*

มันหมายถึงข้อโต้แย้งของคำสั่งก่อนหน้า ใช้กรณี:

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

:p

เพียงพิมพ์คำสั่งโดยไม่ต้องดำเนินการคุณจะต้องวางไว้ที่ส่วนท้ายของตัวกำหนดเหตุการณ์

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

เพิ่มเติมที่นี่


3
อ่านman history
Costas

1
เป็นกรณีพิเศษของการขยายประวัติซึ่งเชลล์พยายามที่จะขยายคำที่เริ่มต้นด้วย!คำสั่งที่ตรงกันในรายการประวัติของเชลล์ปัจจุบัน !!เป็นกรณีพิเศษเทียบเท่ากับ!-1ที่จำนวนลบnต่อไปนี้!อ้างถึงคำสั่งก่อนหน้านี้ที่ n
chepner

1
@Costas อ่านLESS='+/^HISTORY EXPANSION' man bashได้ง่ายขึ้น
Wildcard

คำตอบ:


34

!!อยู่ในbashคู่มือภายใต้หัวข้อ "นักออกแบบเหตุการณ์":

   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.

ดังนั้น!!จะถูกแทนที่ด้วยคำสั่งก่อนหน้า

โปรดทราบว่าประวัติเชลล์จะไม่ประกอบด้วยตัวอักษร!!แต่แทนคำสั่งจริงที่ถูกดำเนินการ:

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