Score:16

ฉันจะรันคำสั่งวินาทีสุดท้ายอีกครั้งได้อย่างไร

ธง cn

ฉันใช้ Ubuntu 21.10 ถ้าฉันทำพลาด ฉันสามารถเรียกใช้คำสั่งสุดท้ายอีกครั้งด้วย !!. นี่คือตัวอย่าง:

$ ฉลาดปรับปรุง
กำลังอ่านรายการแพ็กเกจ...เสร็จแล้ว
E: ไม่สามารถเปิดไฟล์ล็อค /var/lib/apt/lists/lock - เปิด (13: ปฏิเสธการอนุญาต)
E: ไม่สามารถล็อกไดเร็กทอรี /var/lib/apt/lists/
W: ปัญหาในการยกเลิกการเชื่อมโยงไฟล์ /var/cache/apt/pkgcache.bin - RemoveCaches (13: ปฏิเสธการอนุญาต)
W: ปัญหาในการยกเลิกการเชื่อมโยงไฟล์ /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: การอนุญาตถูกปฏิเสธ)
$ sudo !!
อัปเดต sudo apt
[sudo] รหัสผ่านสำหรับ [ฉัน]:
...
ดึงข้อมูล 336 kB ใน 2 วินาที (206 kB/s)
กำลังอ่านรายการแพ็กเกจ...เสร็จแล้ว
สร้างต้นไม้พึ่งพา
กำลังอ่านข้อมูลสถานะ...
สามารถอัพเกรดได้ 98 แพ็คเกจ เรียกใช้ 'apt list --upgradable' เพื่อดู

ไม่เป็นไร แต่แทนที่จะรันคำสั่งก่อนหน้าซ้ำ ฉันจะรันคำสั่งก่อนหน้านี้ได้อย่างไร แบบนี้:

$ สะท้อนสวัสดี
สวัสดี
$ สะท้อนสวัสดี
สวัสดี
$ !! <-- ฉันกำลังพยายามทำให้มันทำงาน 'echo hi'
สวัสดี

โดยทั่วไปนี่คือสิ่งที่ฉันกำลังมองหา

$ สะท้อนสวัสดี
สวัสดี
$ สะท้อนสวัสดี
สวัสดี
$ ??? <-- ฉันจะใส่อะไรที่นี่เพื่อให้เรียกใช้ 'echo hi'
ก้อง สวัสดี!
สวัสดี!

ดังนั้นเมื่อพิจารณาแล้ว !! รันคำสั่งสุดท้าย ฉันจะรันคำสั่งก่อนคำสั่งก่อนหน้าได้อย่างไร ในตัวอย่างของฉัน แทนที่จะพิมพ์ !!สิ่งที่ฉันสามารถเรียกใช้เพื่อดำเนินการ ก้องสวัสดี?

raj avatar
cn flag
raj
ทางลัดเช่น `!!` มีประโยชน์ใน `sh` แบบเก่าทั่วไป ซึ่งไม่มีประวัติคำสั่งและการแก้ไข ใน `bash` ไม่จำเป็นต้องใช้อีกต่อไป เพราะคุณสามารถไปที่คำสั่งก่อนหน้า/ถัดไปได้อย่างอิสระโดยกดลูกศรขึ้น/ลง
bac0n avatar
cn flag
`echo $(!-2)` มีความเป็นไปได้ที่จะฝังตัวกำหนดเหตุการณ์
cg flag
หากคุณต้องการเรียกใช้คำสั่งก่อนที่จะรันคำสั่งก่อนหน้า ฉันขอแนะนำให้ใช้โปรแกรมเสริมไทม์แมชชีนเพื่อทุบตี ในขณะที่ถ้าคุณต้องการรันคำสั่งก่อนสุดท้ายอีกครั้ง นั่นก็เป็นอีกเรื่องหนึ่ง
cg flag
ใช่ ... "เรียกใช้คำสั่งอีกครั้งก่อนครั้งสุดท้าย" หรือ "เรียกใช้คำสั่ง Nth อีกครั้งจากประวัติ"
Itération 122442 avatar
us flag
+1 เพราะคุณสอนฉันเกี่ยวกับ !! :)
br flag
JoL
@raj ตามข้อตกลงกับ bac0n ฉันยังใช้มันเพื่อฝัง บางครั้งฉันเรียกใช้คำสั่งหนึ่ง จากนั้นอีกคำสั่ง จากนั้นฉันต้องการเปรียบเทียบผลลัพธ์ และทำบางอย่างเช่น `diff -u
Peter - Reinstate Monica avatar
https://man7.org/linux/man-pages/man3/readline.3.html, Ctrl-F "คำสั่งสำหรับจัดการประวัติ"
Score:41
ธง au

คุณสามารถใช้ ลูกศรขึ้น และ ลูกศรลง ปุ่มเพื่อวนดูประวัติคำสั่งของคุณ หากต้องการเรียกใช้คำสั่งสุดท้ายอีกครั้ง คุณต้องกด ลูกศรขึ้น สองครั้งแล้ว กลับ.

สิ่งนี้มีข้อดีหลายประการเหนือวิธีการเช่น !-2. สิ่งสำคัญที่สุดคือ (ในความคิดของฉัน) คุณสามารถดูคำสั่งและตรวจสอบให้แน่ใจว่าเป็นคำสั่งที่คุณต้องการเรียกใช้ใหม่ก่อนที่จะกด return เพื่อดำเนินการ นอกเหนือจากข้อผิดพลาดทั่วไป ("อ๊ะ ฉันเดาว่ามันเป็นคำสั่งย้อนกลับที่สามที่ฉันต้องการ") ประวัติการทุบตีอาจไม่นับคำสั่งก่อนหน้าตามที่คุณคาดหวังเนื่องจากตัวเลือกเช่น ละเว้น, เพิกเฉย, และ ฮิสคอนโทรล ตัวแปร.

นอกจากนี้ การเรียกคืนคำสั่งแบบโต้ตอบยังช่วยให้คุณแก้ไขคำสั่งได้อย่างง่ายดายก่อนที่จะเรียกใช้อีกครั้ง คุณสามารถทำได้ด้วยตัวดัดแปลงการเรียกคืนประวัติเช่นกัน แต่การทำแบบโต้ตอบอีกครั้งจะช่วยให้คุณเห็นการแก้ไขของคุณก่อนที่จะดำเนินการคำสั่งเรียกคืน/แก้ไข

แถมถ้าคุณขี้เกียจเหมือนฉัน ลูกศรขึ้น ลูกศรขึ้น กลับ พิมพ์ง่ายกว่า (กะ)อัศเจรีย์ ลบ 2 กลับ

Quasímodo avatar
jp flag
"ที่สำคัญที่สุด (ในความคิดของฉัน) คุณสามารถดูคำสั่งและตรวจสอบให้แน่ใจว่าเป็นคำสั่งที่คุณต้องการเรียกใช้ใหม่ก่อนที่จะกด return เพื่อดำเนินการ" หากคุณเปิดใช้งาน 'histverify' คำสั่งใด ๆ ที่มีการแทนที่ประวัติจะต้องได้รับการยืนยันก่อนที่จะแยกวิเคราะห์โดยเชลล์ อย่างไรก็ตาม ฉันก็ขี้เกียจเหมือนคุณ ดังนั้นฉันจึงชอบคำแนะนำของคุณในกรณีนี้
Ruslan avatar
bv flag
หากคุณต้องการรักษามือของคุณไว้แถวบ้านแทนที่จะเดินไปมาบนแป้นพิมพ์ คำสั่งผสมที่ง่ายกว่าคือ Ctrl-P (จำว่า "ก่อนหน้า") แทนลูกศรขึ้น และ Ctrl-N (สำหรับ "ถัดไป") แทนที่จะเป็นลูกศรลง ดังนั้น Ctrl-PP กลับ
Nate T avatar
it flag
ด้วยข้อเสียที่สำคัญคือการขาดความสามารถในการเขียนสคริปต์ อย่างน้อยก็ในรูปแบบที่เหมาะสม
Akbarkhon Variskhanov avatar
mx flag
คุณยังสามารถกด M-^ (เช่น Alt+Shift+6 หรือ ESC Shift+6) เพื่อเริ่มการขยายประวัติในบรรทัดปัจจุบัน
Score:35
ธง hr

จาก การขยายประวัติศาสตร์ ส่วนของ ผู้ชายทุบตี:

!-n อ้างถึงคำสั่งปัจจุบัน ลบ n

ดังนั้นหากต้องการเรียกใช้คำสั่งก่อนสุดท้าย คุณสามารถใช้ !-2

ในความเป็นจริง, !! เป็นเพียงคำพ้องของ !-1

tw flag
คุณหมายถึงนักวิทยาศาสตร์คอมพิวเตอร์เริ่มนับจากศูนย์เมื่อไปข้างหน้า แต่จาก -1 เมื่อถอยหลัง? เด็กเนิร์ดพวกนี้เรียนนับเลขมาจากไหน?
SusanW avatar
in flag
@MikeMaxwell ต้องเป็นมุมแหลมของประวัติศาสตร์ :-D
OmarL avatar
sy flag
@MikeMaxwell ในกรณีนี้ 0 คือสิ่งที่คุณกำลังป้อน -1 คือคำสั่งก่อนหน้า -2 คือคำสั่งก่อนหน้า แต่หนึ่ง มันสมเหตุสมผลสำหรับฉัน :-)
HiddenWindshield avatar
us flag
@OmarL ถ้าคำสั่งถัดไปที่ฉันจะพิมพ์เป็น `echo "ตลาดหุ้นกำลังจะเป็น X"` ในอีกสองชั่วโมง นั่นหมายความว่าฉันสามารถใช้ `!1` เพื่อดูว่าหุ้นตัวใด อีกสองชั่วโมงจากนี้ไปตลาด?
OmarL avatar
sy flag
@HiddenWindshield นั่นคือ ... สร้างสรรค์ แต่ไม่มีลูกเต๋า: `-bash: !1: ไม่พบเหตุการณ์`
Score:7
ธง tz

!-น ดำเนินการคำสั่ง "-n" ของประวัติของคุณ แต่ฉันจะไม่แนะนำ เนื่องจากเป็น "ทันที" และจะไม่ให้คุณมีเวลาตรวจสอบก่อนว่าคำสั่ง "Nth" นั้นถูกต้อง คุณต้องดำเนินการอีกครั้ง.. . ( @bac0n สังเกตอย่างดีว่าคุณสามารถตั้งค่า: shopt -s ตรวจสอบประวัติ เพื่อเปลี่ยนเป็น "ไม่ทันที": จะให้คุณตรวจสอบคำสั่ง !-n ขยายเป็น ก่อนที่จะดำเนินการด้วย <Enter>)

อย่างไรก็ตาม หากคุณกำลังใช้ ทุบตี ในฐานะเชลล์ของคุณ ฉันอยากจะแนะนำให้ใช้คุณลักษณะการค้นหามากกว่า:

Ctrl แล้วพิมพ์ บางสิ่งบางอย่างซึ่งเป็นส่วนของคำสั่งที่คุณกำลังมองหา (อดีต: Ctrl + + (พิมพ์ลงในเทอร์มินัล) เสียงสะท้อน)

มันจะนำเสนอเหตุการณ์ล่าสุดในการจับคู่ประวัติของคุณ บางสิ่งบางอย่าง (เช่น จับคู่คำค้นหาที่คุณพิมพ์หลังจากนั้น Ctrl + ).

ภายหลัง Ctrl + จะมองย้อนกลับไปในประวัติของคุณ หรือเพิ่มตัวอักษรจะทำให้การค้นหาแม่นยำขึ้น

และเมื่อคุณพบคู่ที่ดีแล้ว ให้กด เข้า เพื่อดำเนินการอีกครั้ง (หรือ Ctrl + เพื่อออกจากการค้นหาโดยไม่ต้องดำเนินการคำสั่งจับคู่ที่แสดงอยู่ในปัจจุบัน)

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

และทุกครั้งที่คุณใช้สิ่งเหล่านั้น คุณจะได้รับอนุญาตให้เปลี่ยนแปลงบางอย่างในบรรทัดที่แสดงอยู่ในปัจจุบัน (โดยใช้ปุ่มลูกศรซ้ายหรือขวาเพื่อเลื่อนไปมาภายในบรรทัดนั้น) เช่น พารามิเตอร์ ชื่อเซิร์ฟเวอร์ ฯลฯ และเรียกใช้บรรทัดที่แก้ไขนั้น + ไปที่อันถัดไป (ถ้าคุณกด Ctrl + โอ).

bac0n avatar
cn flag
ขึ้นอยู่กับวิธีที่คุณตั้งค่าตัวเลือกเชลล์ ... คุณสามารถต่อท้าย `shopt -s histverify` หากคุณไม่ต้องการเรียกใช้รายการโดยตรง
Nate T avatar
it flag
นอกจากนี้ คุณอาจเพิ่มว่านี่เป็นเฉพาะทุบตี เชลล์ที่ทันสมัยส่วนใหญ่มีการติดตามประวัติ / รันซ้ำในรูปแบบใดรูปแบบหนึ่ง แต่การใช้งานและไวยากรณ์ / ทางลัดจะแตกต่างจากเชลล์หนึ่งไปยังอีกเชลล์หนึ่ง
tz flag
ขอบคุณ @NateT และ bac0n 2 คะแนนที่ดีที่ฉันละไว้ในคำตอบของฉัน ฉันแก้ไขมันใน
Ruslan avatar
bv flag
หากต้องการเสริม Ctrl-R สำหรับ `reverse-i-search` มี Ctrl-S สำหรับ `i-search` ไปข้างหน้า (มีประโยชน์เมื่อคุณพลาดรายการที่ถูกต้องและจำเป็นต้อง "ย้อนกลับ") แม้ว่าจะมี [คำเตือน](https ://stackoverflow.com/q/791765/673852).
tz flag
@Ruslan เพิ่มสิ่งที่น่าสนใจ แต่ฉันไม่ได้สนใจที่จะเพิ่มสิ่งนั้นเพราะมันใช้บ่อยน้อยกว่าและบางครั้งก็เชื่อมโยงกับสิ่งอื่น (ctrl-s [หยุดเทอร์มินัลไม่ให้ส่งออกอักขระ] ctrl-q [ดำเนินการต่อตัวละคร เอาต์พุต] ตัวอย่างเช่น โดยค่าเริ่มต้นในเชลล์จำนวนมาก ดู https://unix.stackexchange.com/a/72092/27616 ) อาจต้องมีการตั้งค่าเพิ่มเติมบางอย่าง (ของ readline? และ stty) เพื่อให้ทุกอย่างทำงานได้ และสามารถดูตัวอย่างได้ใน unix.se
Ruslan avatar
bv flag
@OlivierDulac นั่นคือคำเตือนที่อยู่ลิงก์ของฉัน :)
tz flag
@Ruslan : อ๊ะ ไม่ได้สังเกตอันนั้น ขอโทษด้วย ^^
Score:4
ธง cn

หากคุณวิ่ง

ประวัติศาสตร์

คุณจะได้รับรายการคำสั่ง 'n' ล่าสุดที่ป้อน ขนาดประวัติเริ่มต้นที่ 500 คำสั่ง ตามที่อธิบายโดย steeldriver คำสั่งก่อนคำสั่งสุดท้ายสามารถรันซ้ำได้

!-2

และใช่ ที่สามถึงสุดท้ายจะเป็น

!-3

และอื่น ๆ สำหรับรายละเอียดเพิ่มเติม ใช้

ประวัติผู้ชาย

และค้นหา ผู้กำหนดเหตุการณ์.

kopaka avatar
cn flag
เพิ่มเติมเล็กน้อย: คุณสามารถเรียกใช้คำสั่งเฉพาะจากประวัติได้โดยใช้ `!312` (เพื่อเรียกใช้คำสั่งด้วยหมายเลขบรรทัด 312 ที่แสดงในเอาต์พุตประวัติของคุณ) เคล็ดลับที่มีประโยชน์ยิ่งกว่า: หากคุณพิมพ์คำสั่งนั้นผิด คุณสามารถเรียกใช้ `!312:p` ซึ่งจะไม่เรียกใช้คำสั่ง แต่ยังคงวางไว้ด้านบนเป็น "คำสั่งที่ใช้ล่าสุด" สิ่งนี้ช่วยคุณในการแก้ไขคำสั่งที่ยาวขึ้นโดยไม่ต้องคัดลอกและวางจากประวัติด้วยตนเอง เพียงแค่ใช้ลูกศรขึ้นและแก้ไขคำสั่งก่อนที่จะเรียกใช้
Latkar avatar
cn flag
ยอดเยี่ยม! รายการตัวดัดแปลงของ "ประวัติศาสตร์" เต็มไปด้วยความประหลาดใจ ขอบคุณ!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา