Чи можна змінити команду в оболонці bash?


12

Мені було цікаво, чи є (проста) можливість повторити / скасувати команду, виконану в оболонці bash? (щоб його скасувати)

Чи є щось подібне до комбінації ctrl+, zщоб повторити будь-яку дію (наприклад, у слові чи LibreOffice)?


8
коротка відповідь - ні. якась команда може бути відмінена, але загального скасування немає.
Архемар

3
як говорили інші, жодна undoкоманда, щоб мати сучасне резервне копіювання всієї операційної системи, дійсно корисно. Коли щось піде не так, ви просто відновите попередній стан. Подивися на rsnapshot , наприклад
ARKADIUSZ Drabczyk

1
Я хотів би знайти спосіб скасувати команду halt -p
Скаперен

3
@Joshua Опублікування коментаря за допомогою команди, яка може знищити дані користувача, і жодне пояснення не є прийнятною поведінкою. Це не смішно, це захаращує сайт і, головне, це небезпечно. Не робіть цього ще раз.
тердон

2
Я хотів би скасувати shutdownкоманду lol .. не можу повірити, що такі питання також можуть отримати 8 оновлень за день !!
MagExt

Відповіді:


33

Ви повинні розуміти, що bashце просто середовище виконання. Він виконує команди, які ви викликаєте - це не справа оболонки, навіть щоб знати, що робить команда, ви можете викликати будь-який виконуваний файл. У більшості випадків навіть не зрозуміло, що б зробити скасуванням - наприклад, чи можете ви "зняти" фільм? Чи можете ви "розіслати" електронний лист? Що, наприклад, навіть означатиме "скасування запущеного Firefox"? Ви можете закрити його, але закладки, завантаження та історія не будуть однаковими.

Якщо ви запускаєте команду, вона виконується, що б вона не робила. Вам належить знати, що ви робите. Зауважте, що це не означає, що окремі команди не мають "скасувати" ... вони можуть - ви навіть можете написати функцію обгортки, яка робить щось, щоб захистити вас від нерозумних помилок.

Наприклад, mvлегко повернути, просто перемістивши файл туди, звідки він взявся, якщо ви щось не перезаписали. Ось чому -iперемикач існує, щоб запитати вас перед перезаписом. Технічно, зворотне cpце rm, якщо що - то не було переписано (знову ж , -iзапитає вас про це). rmє більш постійним, щоб спробувати повернути файли, вам доведеться зробити хакінг нижчого рівня (для цього є інструменти). Якщо ви розглянули файлову систему як чорну скриньку, технічно це взагалі не було б можливим (лише деталі логічного та фізичного компонування даних дозволяють зробити деякий контроль пошкоджень). rmозначає rm, що якщо ви хочете "сміттєвий" функціонал, це насправді простоmvв якийсь попередньо домовлений каталог (і, можливо, запланований сервіс для його обслуговування або спорожнення) - нічого особливого в цьому немає. Але ви можете скористатись -iзапитом перед видаленням. Ви можете використовувати функцію або псевдонім, щоб завжди включати -iв ці команди.

Зауважте, що більшість програм по-різному захищають вас від втрати даних. Більшість текстових редакторів (~ всі) створюють файли резервного копіювання, ~якщо ви хочете повернути стару версію. У деяких дистрибутивах lsза замовчуванням він псевдонім, щоб він приховав їх ( -B), але вони там є. Великий захист надається правильним керуванням дозволів: не використовуйте root, якщо вам це не потрібно, зробіть файли лише для читання, якщо ви не хочете, щоб вони змінювалися. Іноді корисно створити середовище «пісочниці» - ви запускаєте речі на копії, бачите, чи це добре, а потім об'єднуєте зміни (або відмовляєтесь від змін). chrootабо lxcможе перешкодити скриптам вийти з каталогу та заподіяти шкоду.

Коли ви намагаєтеся виконувати речі масово - наприклад, якщо у вас є складна команда пошуку, тоді як цикл, довгий конвеєр чи щось подібне, добре спершу лише echoті команди, які будуть виконані. Потім, якщо команди виглядають розумними, видаліть echoі запустіть їх по-справжньому. І звичайно, якщо ви дійсно не впевнені в тому, що робите, спочатку зробіть копію. Я іноді просто створюю тарбол поточного каталогу.

Якщо говорити про тарболи - тарбоми та zipbombs є досить поширеними на жаль (коли люди роблять архів без належного підкаталогу, і розпаковуючи, розкидають файли навколо, роблячи величезний безлад). Я звик просто робити підкаталог перед розпакуванням (я міг перерахувати вміст, але я лінивий). Я думаю про створення скрипту, який створить підкаталог, лише якщо вміст був заархівований без підкаталогу. Але коли це відбувається, ls -lrtдопомагає знайти найсвіжіші файли, щоб розмістити їх там, де вони належать. Я щойно наводив це як приклад - програма може мати безліч побічних ефектів, про які оболонка не може знати (Як це можна? Це називається інша програма!) Єдиний вірний спосіб уникнути помилок - бути обережним (подумайте двічі, запустити один раз).

Можливо, найнебезпечнішими командами є команди, які мають справу з файловою системою: mkfs, fdisk / gdisk тощо. Вони можуть повністю знищити файлову систему (хоча при належному криміналістичному програмному забезпеченні можлива хоча б часткова зворотна інженерія). Завжди двічі перевіряйте пристрій, який ви форматуєте, і розділення правильне, перш ніж запустити команду.


14

Ні, у Баша немає такого поняття, як "скасувати". Ось чому слід спочатку двічі перевірити свої команди або протестувати їх на неважливих файлах (якщо це можливо). І потрійно перевірити, чи ви робите речі як root;)


1
Ctr + / виконує скасування певних команд управління в терміналі bash, але не всі команди є невідмінними.
Ерік Лещинський

@EricLeschinski Ви могли б надати якісь посилання?
Ератьєль

Це поховано у відповідях-коментарях цієї сторінки: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Для того, щоб він працював, наберіть кілька слів на терміналі. Перемістіть курсор ліворуч над символом, натисніть Ctrl-d для видалення під символом, потім натисніть Ctrl + /, що скасовує видалення.
Ерік Лещинський

1
О, але це щось принципово відрізняється від скасування команди. Якщо ви видалите файл із rm, файл зник, він пройшов, він помер, його більше немає, це колишній файл (попередження Monty Python). Тепер його родичі плачуть від скорботи, і ви не можете скасувати свій вчинок. Те, про що ви говорите, - це скасування введення або видалення символів, і я підозрюю, що це особливість емулятора вашого терміналу. Я щойно спробував це в Термінаторі, і він працює. Перехід на іншу консоль (у моєму випадку Ctrl + Alt + F1) не дозволяє їй працювати.
Ератьєль

Існує скасування введення команд терміналів і скасування команди після виконання. Я прийшов сюди шукати колишнього.
Ерік Лещинський

11

Ні, немає загального скасування, але деякі наслідки є більш оборотними, ніж інші. Візьмемо для прикладу rm: він по суті використовується для двох цілей - уникнення безладу та звільнення місця для нових файлів. Маючи трохи удачі, ви можете отримати вміст файлу, використовуючи такі інструменти extundelete, тому що при запуску перезаписується лише вказівник на початок файлу rm; зміст перезаписується , коли операційна система повторно цей простір (яке може статися мілісекунди або роки). Через цю функціональність rmпотрапляє в середину шкали систем, які є більш-менш руйнівними. З одного боку - сміттясистеми, які надають спосіб уникнути захаращень без ризику негайно втратити дані (оскільки скасування тривіально). Ще більш консервативними є написання одного разу, зчитування багатьох систем ("WORM"), де дані не можуть бути видалені або перезаписані за бажанням системою, що записує на нього. На іншому кінці шкали - це системи подрібнення , які крім покажчика перезаписують вміст файлу (як правило, кілька разів). На той момент технологія відновлення ваших даних, ймовірно, ще не існує (і, можливо, ніколи не існує).

Таким чином, ви можете бачити, як конкретний інструмент, який найбільше використовується ( rm), не є єдиною альтернативою, але він пропонує компроміс, з яким більшість людей здається:

  • Видалення покажчика на файл відбувається дуже швидко і дуже мало сприяє погіршенню диска
  • У вас менше шансів на те, що в системах з високою автоматизацією не вистачить місця
  • Забезпечує дуже скромний, але ненульовий захист конфіденційності та, навпаки, гарантії відновлення
  • Низька складність і, отже, низька ймовірність помилок або несподіваної поведінки

Якщо вигідні ваші інструменти неприйнятні для вас, погляньте навколо. Швидше за все, є інструменти, які приймають рішення, які підходять саме вам .


3
Єдина частина цієї відповіді, яка стосується питання, - це перший рядок
Альваро

Просто намагаюся пояснити, чому все саме так, з точки зору систематичного управління.
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

Як і інші добрі відповіді, сказані: в оболонці немає "скасування". Але у вашому конкретному випадку використання, щоб скасувати а shutdown, ви можете вбити процес відключення: див. Https://stackoverflow.com/a/526330

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.