รันคำสั่งเดียวกันอีกครั้ง แต่เป็นรูต


117

บางครั้งเมื่อฉันเรียกใช้คำสั่งฉันไม่ได้สังเกตว่าฉันต้องการเรียกใช้ในฐานะผู้ใช้ขั้นสูงเพื่อให้ได้รับอนุญาตเพียงพอ

มีวิธีเรียกใช้คำสั่งเดียวกันอีกครั้ง แต่เป็นผู้ใช้ super หรือไม่?

คำตอบ:


196

วิธีที่ง่ายที่สุดคือเรียกใช้:

sudo !!

สิ่งนี้จะรันคำสั่งสุดท้าย แต่เป็นผู้ใช้ขั้นสูง

แหล่ง


5
ฉันพบว่ามันมีประโยชน์มากและฉันไม่เคยเจอมาก่อน (แม้ว่ามันอาจเป็นความรู้ทั่วไป) ฉันหามันไม่เจอในเว็บไซต์ดังนั้นฉันคิดว่าฉันจะตอบเอง
Trufa

30
เช่นกันการดำเนินการเกี่ยวกับการทำงานของตัวเองคำสั่งก่อนหน้าของคุณตามที่บันทึกไว้ใน!! historyนอกจากนี้การทำ!-1, !-2และอื่น ๆ ดำเนินการคำสั่งของคุณที่ผ่านมาคำสั่งสุดท้ายที่สองและอื่น ๆ ที่มีประโยชน์!
oaskamay

6
ในฐานะที่เป็นอีกคนหนึ่งที่!<command>จะดำเนินการเหตุการณ์สุดท้ายจาก~/.bash_historyที่เริ่มต้นด้วย<command>
Radu Rădeanu

1
ctrl-r ก็มีประโยชน์มากเช่นกัน มันจะค้นหาย้อนหลังในประวัติศาสตร์ของคุณสำหรับคำสั่งที่ตรงกับสิ่งที่คุณพิมพ์ สิ่งนี้จะช่วยให้คุณแก้ไขคำสั่งก่อนที่จะเรียกใช้อีกครั้ง
KayEss

4
!สิ่งทุบตีโง่ ๆที่คัดลอกมาจากtcshนี้ทำให้ฉันเสียเวลามากกว่าที่เคยเป็นประโยชน์ !ราคาคู่ไม่ได้ป้องกันจากการตีความของ ->$ foo "!bar" !bar: event not found
Kaz

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ :คุณป้อนsudo !!ทันทีหลังจากนั้นเพื่อทำซ้ำคำสั่งก่อนหน้าด้วยสิทธิ์ที่เพิ่มขึ้น

แก้ไข: พบรูปภาพผ่านredditและเป็นเรื่องตลกของการ์ตูน xkcd ต้นฉบับโดย Randall Munroe


3
โปรดอย่ามีการสนทนาในเชิงบวกหรือเชิงลบที่นี่ในความคิดเห็น หากคุณต้องการหารือเกี่ยวกับข้อดีหรืออื่น ๆ โปรดใช้ Meta ขอบคุณ
fossfreedom

17

คุณสามารถลองใช้ปุ่มลูกศรขึ้นเพื่อเลื่อนดูคำสั่งเก่าและเขียนใหม่ / เปลี่ยนคำสั่งเหล่านั้นและเพิ่มคำสั่งsudoด้านหน้า (ปุ่มโฮมเหนือปุ่มลูกศรจะกำหนดตำแหน่งเป็นจุดเริ่มต้น)

ฉันไม่ชอบsudo !!ความคิดเพราะบางครั้งคุณเพิ่มคำสั่งอื่นในระหว่างและจำไม่ได้อีกต่อไป


1
โชคดีที่เมื่อคุณทำเช่นsudo !!นี้เชลล์จะขยายตัว!!เพื่อให้คุณเห็นคำสั่งที่พยายามเรียกใช้ ดังนั้นมันอาจจบลงด้วยการหงุดหงิดที่จะกด Ctrl-C และค้นหาคำสั่งที่ถูกต้อง แต่อย่างน้อยมันก็ไม่ทำให้คุณไม่รู้ตัว
เรด

4
@Reid มันจะไม่ขยายจนกระทั่งหลังจากที่คุณกด Enter และถ้าคุณอยู่ในหน้าต่างที่ที่คุณไม่ต้องใส่รหัสผ่านของคุณอีกครั้งมันจะทำงานโดยไม่มีการยืนยัน +1 เพื่อใช้ประวัติแทนการใช้สุ่มสี่สุ่มห้า!!
Izkata

5
@Izkata: ฉันคิดว่ามันเป็นเรื่องจริง ฉันใช้ zsh ดังนั้นฉันแค่พิมพ์sudo !!<TAB>และเติมข้อความอัตโนมัติ!!ให้ฉัน Bash สามารถขยายประวัติด้วยM-^(สำหรับฉัน, alt + shift + 6), แต่มันก็คล่องแคล่วน้อยกว่า (คุณสามารถปฏิเสธเรื่องนี้ได้) นอกจากนี้ยังมีshopt -s histverifyซึ่งจะทำให้เมื่อคุณใช้การขยายประวัติและกด Enter มันจะให้บรรทัดการแจ้งเตือนอื่นพร้อมการขยายที่ดำเนินการเพื่อให้คุณเห็น / แก้ไข
เรด

1
ฉันคิดถึงสถานการณ์ที่ฉันพิมพ์คำสั่งมากกว่าเดิมคำสั่งส่งคืนสิทธิ์ที่ถูกปฏิเสธและฉันรู้ว่าฉันต้องการเรียกใช้คำสั่งเดียวกันนี้อีกครั้ง แต่เมื่อ sudo กระบวนการกดขึ้นบ้านพิมพ์ sudo และรู้สึกมาก ช้ากว่าฉัน มันเป็นวิธีที่ฉันทำมันตลอดไปและมันก็รู้สึกไร้ประสิทธิภาพ
Trufa

@Reid: shopt -s histverifyไม่ช่วยสักหน่อย คนส่วนใหญ่จะคุ้นเคยกับการกดปุ่มEnterสองครั้ง ณ จุดนั้นพวกเขายังคงสายเกินไปที่จะตรวจสอบสิ่งที่เกิดขึ้น
Frank Kusters

13

ฉันจะเพิ่มทางเลือกอื่น: สั้นเท่ากับพิมพ์sudo !!และยืดหยุ่นมากขึ้น:

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

มันเป็นจำนวนการกดแป้นที่เท่ากัน (ฉันนับว่า "ctrl + A" เป็นหนึ่ง ... ) แต่การเพิ่ม "ลูกศรขึ้น" คุณสามารถทำได้ตามคำสั่งใดก็ตามที่อยู่ในประวัติของคุณ


1
ctrl + A มาจากการผูก emacs คุณยังสามารถใช้การเชื่อม vi ( set -o vi) จากนั้นคุณสามารถหลบหนี (ไปที่โหมดคำสั่ง) จากนั้น 'ฉัน' (ตัวพิมพ์ใหญ่ 'i' ใส่ที่จุดเริ่มต้นของบรรทัด)
แกร์ฮาร์ดเบอร์เกอร์

1
@ GerhardBurger: ฉันรู้ แต่แปลกฉันรัก vi (โดยเฉพาะกลุ่ม) สำหรับการแก้ไขเอกสารหลายบรรทัด แต่ฉันชอบ emacs ที่ผูกในเชลล์ (ต้องเปลี่ยนจากคำสั่งเป็นโหมดแก้ไขในเชลล์ไม่ได้ ทำให้สมเหตุสมผล imo และทางลัดของ emacs นั้นเพียงพอสำหรับการใช้งานในชีวิตประจำวันแม้ว่าจะมีประสิทธิภาพน้อยลง)
Olivier Dulac

จริงฉันเพิ่มมันเพียงเพื่อความสมบูรณ์แบบสำหรับฉันมันเหมือนกัน แต่ฉันค้นหาด้วย '/' สะดวกสบายมาก;)
Gerhard Burger

@ GerhardBurger: เกี่ยวกับ "/" ของโหมด vi, bash ปกติ (การผูก emacs) ยังมีวิธีที่สะดวกมากในการค้นหาคำสั่งก่อนหน้าโดยการพิมพ์ตัวอักษรสองสามตัวแล้ว 'ctrl + r' จนกว่าคุณจะพบมัน
Olivier Dulac

7

มีสองสามวิธีในการทำเช่นนี้

  • เพียงป้อนคำสั่งอีกครั้งเพิ่มsudoก่อนคำสั่ง

  • กดUp arrowเพื่อรับคำสั่งสุดท้ายและวางไว้sudoข้างหน้า

  • เข้าสู่ sudo !!

การ!!ขยายเป็นคำสั่งที่ป้อนล่าสุด คุณสามารถทำสิ่งที่คล้ายกันกับสิ่งอื่น ๆ ด้วยประวัติบรรทัดคำสั่งดูที่นี่


7

คำถามนี้อาจถูกทำให้กลายเป็น " Run command command แต่มีการดัดแปลงบางอย่าง " เนื่องจากหนึ่งในการตัดสินใจการออกแบบที่ยอดเยี่ยมใน Unix คือสิ่งที่ถูกนำไปใช้ครั้งเดียวในเชลล์สามารถใช้ประโยชน์จากคำสั่งใด ๆ ที่ถูกเรียกจากเชลล์

ในคำอื่น ๆ , เคล็ดลับนี้ใช้ไม่ได้เพียง เพื่อsudo:

  • ทำซ้ำคำสั่งก่อนหน้านี้ในฐานะ superuser ( sudo !!)
  • ทำซ้ำคำสั่งก่อนหน้าและเวลา ( time !!)
  • ทำซ้ำคำสั่งก่อนหน้าด้วยสภาพแวดล้อมที่แตกต่างกัน ( env A=b B=z !!)
  • ทำซ้ำคำสั่งก่อนหน้า ( !!)

การขยายประวัติ (หรือเรียกอีกอย่างว่าการทดแทนประวัติ) เป็นเพียงคุณลักษณะของเชลล์เพื่อให้การทำซ้ำคำสั่งก่อนหน้านี้ง่ายขึ้น (โดยมีการกดแป้นน้อยกว่า) history expansionตรวจสอบหน้าคนเปลือกของคุณสำหรับ มันอธิบายถึงเทคนิคและทางลัดอื่น ๆ อีกมากมายที่คุณสามารถทำได้ด้วยประวัติเช่น:

คุณอาจอ้างถึงคำสั่งก่อนหน้าตามหมายเลข:

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

คุณอาจอ้างถึงคำแต่ละคำในคำสั่งก่อนหน้า:

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

คุณยังสามารถค้นหาก่อนทำซ้ำ:

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

คุณสามารถค้นหาประวัติและแทนที่บางสิ่งด้วยสิ่งอื่น:

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

และอีกมากมายเนื่องจากคุณสามารถรวมการเลือกคำสั่งการเลือก arg การค้นหาและแทนที่ได้อย่างอิสระ

man page ของเชลล์ของคุณ (ในกรณีนี้man bash) คือเพื่อนของคุณ


1
Briliant! นั่นควรเป็นคำตอบที่ยอมรับได้
Eliran Malka

5

ฉันใช้zshแทนทุบตีและมีอยู่ในของฉัน~/.zshrcดังนั้นกดAlt+ Sแทรกsudoที่จุดเริ่มต้นของบรรทัดคำสั่ง:

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

น่าเสียดายที่ฉันไม่สามารถติดตามวิธีการทำสิ่งเดียวกันในการทุบตี


3
คุณสามารถทำเช่นเดียวกันในทุบตีใช้ GNU Readline: เพิ่มของคุณ~/.inputrc "\es":"\C-asudo "และคุณจะย้ายไปยังจุดเริ่มต้นของเส้นยาวและ sudo alt-sจะถูกแทรกในช่วงเริ่มต้นของบรรทัดเมื่อกด รีสตาร์ทเทอร์มินัลหรืออ่าน~/.inputrcซ้ำเพื่อให้ทำงานได้

2

หากคุณต้องการทำในนามแฝงคุณต้องใช้alias redo='sudo $(history -p !!)'ด้วยเหตุผลบางอย่าง


1
su -c "!!"

หากคุณไม่ได้รับอนุญาตให้เป็น root ด้วย sudo หรือโปรแกรม sudo ไม่ได้ติดตั้งบนระบบ


1

วิธีที่ฉันชอบ:

  • ปุ่มลูกศรขึ้น
  • บ้าน
  • "sudo"
  • เข้าสู่

แต่มันอาจจะง่ายกว่าถ้าคุณทำ "sudo !!" ขึ้นอยู่กับคุณ

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