คุณไม่สามารถติดsudo
อยู่หน้าคำสั่งเชลล์คุณต้องเรียกใช้เชลล์เพื่อประเมินคำสั่งนั้นอีกครั้ง (ทำสิ่งต่าง ๆ เช่นการขยายตัวแปรการเปิดไฟล์สำหรับตัวดำเนินการเปลี่ยนเส้นทางเป็นต้น) นั่นคือ
sudo bash -c !!
ยกเว้นว่ามันจะไม่ได้ผลเพราะ!!
interpolates ข้อความของคำสั่งก่อนหน้าอักขระพิเศษและทั้งหมด sh
คุณจำเป็นต้องดึงข้อความของคำสั่งเป็นสตริงและผ่านที่เป็นอาร์กิวเมนต์ไปยัง โชคดีที่fc
builtinของ bash ช่วยให้คุณทำเช่นนั้นได้¹
sudo bash -c "$(fc -ln -1)"
หรือแม้กระทั่งเพื่อให้แน่ใจว่าได้เรียกใช้ bash รุ่นเดียวกันที่ใช้งานอยู่ในปัจจุบัน:
sudo "$BASH" -c "$(fc -ln -1)"
โปรดทราบว่าเนื่องจากคำสั่งถูกดำเนินการในกระบวนการเชลล์ที่แยกต่างหากคำสั่งจะสืบทอดตัวแปรสภาพแวดล้อม (เฉพาะที่sudo
เก็บรักษาจิตใจ) แต่ไม่ใช่ตัวแปรภายในของเชลล์ ตัวเลือกเชลล์ (เช่นkshglob
) และการตั้งค่าอื่น ๆ จะเริ่มจากค่าเริ่มต้นเช่นกัน
command²เดียวกันทำงานใน zsh และ ksh แม้ว่า ATT ksh93 ต้องการทั้งfirst
และlast
หมายเลขที่จะส่งผ่านไปยังfc
³ (ซึ่งยังใช้งานได้ใน bash, zsh และ pdksh / mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
การใช้$0
เพื่อกำหนดความสามารถในการเรียกใช้งานของเชลล์ที่ทำงานอยู่จะทำงานต่อเมื่อเชลล์ถูกเรียกใช้ผ่าน $ PATH และ $ PATH จะไม่เปลี่ยนแปลงหรือผ่านเส้นทางแบบสัมบูรณ์
นี่เป็นอีกวิธีใน zsh ซึ่งชัดเจนกว่าเล็กน้อย แต่นานกว่า:
sudo zsh -c $history[$[HISTCMD-1]]
คำเตือนขั้นสุดท้าย: sudo
สำหรับคำสั่งที่อาจเป็นอันตราย อย่าทำให้ง่ายเกินไปที่จะใช้!
¹ มีช่องว่างพิเศษบางอย่างในตอนเริ่มต้นและการทดแทนคำสั่งจะตัดการขึ้นบรรทัดใหม่ในตอนท้าย แต่ไวยากรณ์ของเชลล์ไม่สนใจเรื่องนั้น
² ฉันไม่คิดว่า zsh หรือ ksh มีอะไรอย่าง bash's $BASH
; $0
ใช้งานได้เฉพาะเมื่อเป็นพา ธ สัมบูรณ์หรือเมื่อไม่มีสแลชและพา ธ การค้นหาคำสั่งจะไม่เปลี่ยนแปลง
³ เป็นชื่อแทนใน ATT ksh แต่นั่นก็ดีเหมือนกัน fc
hist