เป็นไปได้หรือไม่ที่จะย้อนคำสั่งใน bash shell?


12

ฉันสงสัยว่ามีความเป็นไปได้ (ง่าย) ในการทำซ้ำ / ย้อนกลับคำสั่งที่ดำเนินการใน bash shell หรือไม่? (เพื่อให้ยกเลิกได้)

มีบางสิ่งที่คล้ายกับชุดค่าผสมctrl+ zเพื่อทำซ้ำการกระทำใด ๆ (ตัวอย่างเช่นในคำหรือ LibreOffice)?


8
คำตอบสั้น ๆ คือไม่ คำสั่งบางอย่างอาจถูกเปลี่ยนกลับ แต่ไม่มีสิ่งทั่วไปที่เลิกทำ
Archemar

3
อย่างที่คนอื่น ๆ กล่าวว่าไม่มีundoคำสั่งดังนั้นการสำรองข้อมูลล่าสุดของระบบปฏิบัติการทั้งหมดนั้นมีประโยชน์จริง ๆ เมื่อมีบางอย่างผิดปกติคุณเพียงกู้คืนสถานะก่อนหน้า ลองดูrsnapshotเช่น
Arkadiusz Drabczyk

1
ฉันต้องการหาวิธีที่จะยกเลิกคำสั่ง halt -p
Skaperen

3
@Joshua การโพสต์ความคิดเห็นด้วยคำสั่งที่สามารถทำลายข้อมูลของผู้ใช้และไม่มีคำอธิบายใด ๆ ที่ไม่ใช่พฤติกรรมที่ยอมรับได้ มันไม่ตลกเลยมันทำให้ไซต์กระจัดกระจายและที่สำคัญที่สุดมันอันตราย อย่าทำอย่างนั้นอีกครั้ง
terdon

2
ฉันต้องการยกเลิกshutdownคำสั่ง lol .. ไม่อยากจะเชื่อเลยว่าคำถามเหล่านี้ยังสามารถรับ 8 upvotes ได้ในหนึ่งวัน !!
MagExt

คำตอบ:


33

คุณควรเข้าใจว่าbashเป็นเพียงแค่สภาพแวดล้อมในการดำเนินการ มันรันคำสั่งที่คุณเรียก - ไม่ใช่ธุรกิจของเชลล์ที่จะรู้ว่าคำสั่งทำอะไรคุณสามารถเรียกใช้ไฟล์ที่คุณต้องการได้ ในกรณีส่วนใหญ่จะไม่ชัดเจนว่าจะเลิกทำเช่น - คุณสามารถ "เลิกเล่น" ภาพยนตร์ได้หรือไม่ คุณสามารถ "ยืนยัน" อีเมลได้หรือไม่? ตัวอย่างเช่น "เลิกทำการเรียกใช้ Firefox" หมายความว่าอย่างไร คุณสามารถปิดได้ แต่บุ๊กมาร์กการดาวน์โหลดและประวัติจะไม่เหมือนเดิม

หากคุณเรียกใช้คำสั่งจะถูกดำเนินการไม่ว่าอะไรก็ตาม มันขึ้นอยู่กับคุณที่จะรู้ว่าคุณกำลังทำอะไรอยู่ โปรดทราบว่านี่ไม่ได้หมายความว่าแต่ละคำสั่งไม่มี "เลิกทำ" ... พวกเขาสามารถทำได้ - คุณยังสามารถเขียนฟังก์ชั่น wrapper ที่ทำบางสิ่งบางอย่างเพื่อปกป้องคุณจากความผิดพลาดที่โง่เขลา

ตัวอย่างเช่นmvสามารถย้อนกลับได้ง่ายเพียงแค่ย้ายไฟล์กลับมาจากที่ที่มันมาเว้นแต่คุณจะเขียนทับบางสิ่ง นั่นคือเหตุผลที่-iเปลี่ยนมีอยู่เพื่อถามคุณก่อนที่จะเขียนทับ ในทางเทคนิคสิ่งที่ตรงกันข้ามcpคือrmยกเว้นว่ามีบางอย่างถูกเขียนทับ (อีกครั้ง-iถามคุณเกี่ยวกับเรื่องนี้) rmเป็นการถาวรมากขึ้นหากต้องการรับไฟล์กลับคุณต้องทำการแฮ็กระดับต่ำกว่าจริง ๆ (มีเครื่องมือสำหรับการทำเช่นนั้น) หากคุณพิจารณาว่าระบบไฟล์เป็นกล่องดำก็ไม่สามารถทำได้ในทางเทคนิค (เฉพาะรายละเอียดของรูปแบบตรรกะและกายภาพของข้อมูลช่วยให้คุณสามารถควบคุมความเสียหายได้) rmหมายความว่าrmถ้าคุณต้องการฟังก์ชั่น "ถังขยะ" นั่นก็แค่mvลงในไดเรกทอรีที่มีการจัดเตรียมไว้ล่วงหน้า (และอาจเป็นบริการที่กำหนดเวลาไว้เพื่อรักษาหรือล้างมัน) - ไม่มีอะไรพิเศษเกี่ยวกับมัน แต่คุณสามารถใช้-iเพื่อแจ้งให้คุณทราบก่อนที่จะลบ คุณอาจใช้ฟังก์ชั่นหรือชื่อแทนเพื่อรวม-iไว้ในคำสั่งเหล่านี้เสมอ

โปรดทราบว่าแอปพลิเคชันส่วนใหญ่จะปกป้องคุณจากการสูญเสียข้อมูลในวิธีที่ต่างกัน โปรแกรมแก้ไขข้อความส่วนใหญ่ (~ ทั้งหมด) จะสร้างไฟล์สำรองด้วย~ในตอนท้ายในกรณีที่คุณต้องการให้เวอร์ชันเก่ากลับมา ในบาง distros lsเป็น aliased โดยค่าเริ่มต้นเพื่อให้มันซ่อน ( -B) แต่พวกเขามี การป้องกันจำนวนมากได้รับจากการจัดการสิทธิ์อย่างถูกต้อง: ไม่ต้องรูทหากคุณไม่จำเป็นต้องสร้างไฟล์แบบอ่านอย่างเดียวหากคุณไม่ต้องการให้เปลี่ยน บางครั้งมันมีประโยชน์ที่จะมีสภาพแวดล้อม "แซนด์บ็อกซ์" - คุณรันสิ่งต่าง ๆ บนสำเนาดูว่ามันใช้ได้หรือไม่แล้วรวมการเปลี่ยนแปลง (หรือละทิ้งการเปลี่ยนแปลง) chrootหรือlxcสามารถป้องกันไม่ให้สคริปต์ของคุณหนีออกจากไดเรกทอรีและทำความเสียหาย

เมื่อคุณพยายามที่จะดำเนินการสิ่งต่าง ๆ เป็นกลุ่ม - ตัวอย่างเช่นถ้าคุณมีคำสั่งค้นหาที่ซับซ้อนในขณะที่วนรอบไปป์ไลน์หรืออะไรทำนองนั้นเป็นความคิดที่ดีที่จะเริ่มechoคำสั่งที่จะดำเนินการก่อน จากนั้นหากคำสั่งนั้นดูสมเหตุสมผลให้ลบechoแล้วเรียกใช้จริง และแน่นอนถ้าคุณไม่แน่ใจเกี่ยวกับสิ่งที่คุณทำจริงๆให้ทำสำเนาก่อน บางครั้งฉันก็แค่สร้าง tarball ของไดเรกทอรีปัจจุบัน

การพูดถึง tarballs - tarbombs และ zipbombs เป็นเรื่องปกติที่น่าเสียดาย (เมื่อผู้คนสร้างไฟล์เก็บถาวรโดยไม่ต้องมีไดเรกทอรีย่อยที่เหมาะสมและเปิดไฟล์ที่กระจายอยู่รอบ ๆ ฉันคุ้นเคยกับการสร้างไดเรกทอรีย่อยด้วยตัวเองก่อนนำออกจากกล่อง (ฉันสามารถแสดงรายการเนื้อหาได้ แต่ฉันขี้เกียจ) ฉันกำลังคิดเกี่ยวกับการสร้างสคริปต์ที่จะสร้างไดเรกทอรีย่อยเฉพาะเมื่อเนื้อหาถูกเก็บถาวรโดยไม่มีไดเรกทอรีย่อย แต่เมื่อมันเกิดขึ้นls -lrtช่วยในการค้นหาไฟล์ล่าสุดเพื่อวางที่พวกเขาอยู่ ฉันเพิ่งยกตัวอย่างนี้ - โปรแกรมสามารถมีผลข้างเคียงมากมายที่เชลล์ไม่มีทางรู้ได้ (เป็นไปได้อย่างไรมันเป็นโปรแกรมที่แตกต่างกันที่เรียกว่า!) วิธีเดียวที่จะหลีกเลี่ยงข้อผิดพลาดได้คือการระมัดระวัง (คิด สองครั้งรันหนึ่งครั้ง)

อาจเป็นคำสั่งที่อันตรายที่สุดคือคำสั่งที่จัดการกับระบบไฟล์: mkfs, fdisk / gdisk และอื่น ๆ พวกเขาสามารถทำลายระบบไฟล์ได้อย่างสมบูรณ์ (แม้ว่าจะมีซอฟต์แวร์ทางนิติวิทยาศาสตร์ที่เหมาะสม ตรวจสอบอุปกรณ์ที่คุณกำลังฟอร์แมตและการแบ่งพาร์ติชันให้ถูกต้องเสมอก่อนเรียกใช้คำสั่ง


14

ไม่ไม่มีสิ่งเช่น "เลิกทำ" ใน Bash ขออภัย นี่คือเหตุผลที่คุณควรตรวจสอบคำสั่งของคุณอีกครั้งหรือทดสอบในไฟล์ที่ไม่สำคัญก่อน (ถ้าเป็นไปได้) และตรวจสอบสามครั้งว่าคุณกำลังทำสิ่งต่าง ๆ เหมือนรูทหรือไม่;)


1
Ctr + / ทำการเลิกทำสำหรับคำสั่งควบคุมบางคำสั่งในเทอร์มินัล bash แต่คำสั่งบางคำสั่งไม่สามารถยกเลิกได้
Eric Leschinski

@EricLeschinski คุณช่วยให้การอ้างอิงใด ๆ ?
Erathiel

มันถูกฝังลงในการตอบกลับความคิดเห็นของหน้านี้: skorks.com/2009/09/bash-shortcuts-for-maximum-productivityเพื่อที่จะเห็นมันทำงานพิมพ์คำบางคำบน terminal เลื่อนเคอร์เซอร์ไปทางซ้ายตัวอักขระกด Ctrl-d เพื่อลบภายใต้ตัวอักษรจากนั้นกด Ctrl + / ซึ่งยกเลิกการลบ
Eric Leschinski

1
โอ้ แต่นั่นเป็นสิ่งที่แตกต่างจากการยกเลิกคำสั่งพื้นฐาน หากคุณลบไฟล์ที่มีrmไฟล์หายไปมันก็ล่วงลับไปแล้วมันถึงแก่กรรมแล้วไม่มีอีกต่อไปมันเป็นไฟล์เก่า (Monty Python alert) ตอนนี้ญาติของมันร้องไห้ด้วยความเศร้าและคุณไม่สามารถยกเลิกการกระทำของคุณได้ สิ่งที่คุณกำลังพูดถึงคือการยกเลิกการพิมพ์หรือลบอักขระและฉันคิดว่ามันเป็นคุณสมบัติของเทอร์มินัลอีมูเลเตอร์ของคุณ ฉันเพิ่งลองใน Terminator และใช้งานได้ การสลับไปใช้คอนโซลอื่น (Ctrl + Alt + F1 ในกรณีของฉัน) ไม่อนุญาตให้ใช้งานได้
Erathiel

มีรายการคำสั่งเทอร์มินัลเลิกทำและคำสั่งเทอร์มินัลหลังจากการดำเนินการเลิกทำ ฉันมาที่นี่เพื่อค้นหาอดีต
Eric Leschinski

11

ไม่ไม่มีการเลิกทำแบบทั่วไป แต่ผลที่ตามมาบางอย่างกลับได้ง่ายกว่าคนอื่น ๆ ยกตัวอย่างเช่นrmมันใช้เพื่อวัตถุประสงค์สองประการคือหลีกเลี่ยงความยุ่งเหยิงและเพิ่มพื้นที่ว่างสำหรับไฟล์ใหม่ กับบิตของโชคคุณสามารถดึงเนื้อหาของแฟ้มโดยใช้เครื่องมือเช่นextundeleteเพราะเพียงตัวชี้ไปยังจุดเริ่มต้นของไฟล์ที่ถูกเขียนทับเมื่อคุณเรียกrm; เนื้อหาถูกเขียนทับเมื่อระบบปฏิบัติการ reuses พื้นที่นั้น (ซึ่งอาจเกิดขึ้นมิลลิวินาทีหรือปีต่อมา) เพราะการทำงานนี้rmตกอยู่ในช่วงกลางของการที่ขนาดของระบบที่เป็นมากหรือน้อยกว่าการทำลายล้าง ในอีกด้านหนึ่งมีถังขยะระบบซึ่งเป็นวิธีการหลีกเลี่ยงความยุ่งเหยิงโดยไม่มีความเสี่ยงในการสูญเสียข้อมูลทันที ยิ่งไปกว่านั้นการเขียนครั้งเดียวอ่านระบบ ("WORM") จำนวนมากซึ่งระบบไม่สามารถลบหรือเขียนทับข้อมูลได้ตามความประสงค์ ที่ปลายอีกด้านของเครื่องชั่งคือระบบทำลายเอกสารซึ่งเขียนทับเนื้อหาไฟล์(ปกติหลายครั้ง) นอกเหนือจากตัวชี้ ณ จุดนี้เทคโนโลยีในการกู้คืนข้อมูลของคุณอาจยังไม่มีอยู่ (และอาจไม่มีอยู่จริง)

ดังนั้นคุณสามารถดูว่าเครื่องมือเฉพาะที่ใช้งานมากที่สุด ( rm) ไม่ใช่ทางเลือกเดียว แต่ให้การแลกเปลี่ยนที่คนส่วนใหญ่ดูเหมือนจะสบายใจ:

  • การลบตัวชี้ไฟล์นั้นเร็วมากและมีส่วนช่วยลดความเสื่อมของดิสก์
  • คุณมีโอกาสน้อยที่จะใช้พื้นที่ในระบบซึ่งเป็นระบบอัตโนมัติสูงมาก
  • รับประกันความเป็นส่วนตัว แต่ไม่เป็นศูนย์การปกป้องความเป็นส่วนตัวและในทางกลับกันรับประกันการกู้คืน
  • ความซับซ้อนต่ำและโอกาสในการเกิดข้อบกพร่องหรือพฤติกรรมที่ไม่คาดคิดต่ำ

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


3
ส่วนเดียวของคำตอบนี้ที่ตอบคำถามคือบรรทัดแรก
Alvaro

แค่พยายามอธิบายว่าทำไมสิ่งต่าง ๆ เป็นอย่างนั้นจากมุมมองของระบบ
l0b0

9

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

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

ตัวอย่างเช่นหากคุณเรียกใช้ระบบrm important_file.txtจะแจ้งให้ไดรเวอร์ระบบไฟล์ทราบเพื่อ "ยกเลิกการเชื่อมโยง" ไฟล์ในระบบไฟล์ เชลล์ไม่ทำการดำเนินการ แต่จะเรียกเฉพาะrmที่ทำ

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


1

ไม่ไม่มี แต่ถ้าคุณบอกว่าคุณยุ่งกับไดเรคทอรีที่มีสิทธิพิเศษรูทและทำอะไรบางอย่างที่เมากว่าวิธีที่ดีที่สุดของคุณคือการบันทึกไฟล์ทั้งหมดที่คุณสามารถไปยังไดรฟ์ USB หรือการ์ด SD และรีเซ็ตระบบปฏิบัติการของคุณ ไฟล์ ISO (หากคุณยังมีอยู่หากไม่ได้รับอีกไฟล์หนึ่งแบบออฟไลน์ ... ) หากคุณลบบางสิ่งที่คุณสามารถทำได้ให้ดาวน์โหลดแอปพลิเคชันเพื่อเชื่อมโยงข้อมูลไฟล์ไปยังชื่อไฟล์และบันทึกเนื้อหาไฟล์ (ดูคำถามนี้ที่นี่ ) สำหรับคำตอบเชิงลึกคุณสามารถบอกเราว่าคุณทำอะไรผิด


1

ฉันจะไม่ทำซ้ำสิ่งที่คนอื่นพูด แต่ฉันสามารถเห็นได้จากที่ที่คุณกำลังจะมา วิธีการมาตรฐานของฉันในการดำเนินการคำสั่ง "อันตราย" ได้รับการสะท้อนเพื่อดูว่าตัวแปรทั้งหมดได้รับการขยายอย่างถูกต้องหรือไม่ หากคุณสามารถอ้างถึงกรณีที่เฉพาะเจาะจงเราอาจช่วยเพิ่มเติมได้

ตัวอย่างเช่นในสถานการณ์เช่น:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done

1

เช่นเดียวกับคำตอบที่ดีอื่น ๆ กล่าวว่าไม่มี "เลิกทำ" ในเชลล์ แต่ในกรณีการใช้งานเฉพาะของคุณหากต้องการยกเลิก a shutdownคุณสามารถฆ่ากระบวนการปิดเครื่องได้ที่/programming//a/526330

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