Можно ли отменить команду в оболочке bash?

12

Мне было интересно, есть ли (простая) возможность повторить / отменить команду, которая была выполнена в оболочке bash? (чтобы отменить это)

Есть ли что-то похожее на комбинацию ctrl+, zчтобы повторить какое-либо действие (например, в word или LibreOffice)?

Fraenzine
источник
8
краткий ответ - нет. некоторые команды могут быть отменены, но нет такой вещи, как общая отмена.
Archemar
3
как говорили другие, никакая undoкоманда, поэтому иметь актуальное резервное копирование всей операционной системы, действительно полезна. Когда что-то идет не так, вы просто восстанавливаете предыдущее состояние. Взгляните, например, на rsnapshot
Arkadiusz Drabczyk
1
Я хотел бы найти способ отменить команду halt -p
Skaperen
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и запустите его по-настоящему. И, конечно, если вы действительно не уверены в том, что делаете, сначала сделайте копию. Иногда я просто создаю архив текущей директории.

Говоря о tarballs - к сожалению, tarbombs и zipbombs довольно распространены (когда люди создают архив без надлежащего подкаталога, а распаковка разбрасывает файлы вокруг, создавая огромный беспорядок). Я привык просто делать подкаталог сам перед распаковкой (я мог перечислить содержимое, но я ленив). Я думаю о создании сценария, который будет создавать подкаталог, только если содержимое было заархивировано без подкаталога. Но когда это происходит, ls -lrtпомогает найти самые последние файлы и поместить их туда, где они должны быть. Я просто привел это в качестве примера - у программы может быть много побочных эффектов, о которых оболочка не может знать (как это могло быть? Это другая программа, вызываемая!) Единственный надежный способ избежать ошибок - быть осторожным (подумайте дважды, беги один раз).

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

Орион
источник
14

Нет, в Bash нет такой вещи, как "отмена", извините. Вот почему вы должны перепроверить ваши команды или сначала проверить их на неважных файлах (если это возможно). И трижды проверь, делаешь ли ты как root;)

Erathiel
источник
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), не является единственной альтернативой, но он обеспечивает компромисс, который большинству людей кажется удобным:

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

Если компромиссы, которые делают ваши инструменты, для вас неприемлемы, посмотрите вокруг. Скорее всего, есть инструменты, которые принимают решения, которые подходят именно вам .

l0b0
источник
3
Единственная часть этого ответа, которая касается вопроса, - это первая строка
Альваро
Просто пытаюсь объяснить, почему все так, с точки зрения системного администратора.
10
9

Приложения, которые предоставляют функцию отмены, делают это, поддерживая историю предпринятых действий и либо метод отмены действия, либо снимок состояния объекта для восстановления предыдущего состояния. Команды, выполняемые в оболочке, выполняют прямые действия или выполняют команды для выполнения действий.

Сама оболочка не сможет отменить действия, возникающие в результате выполнения любой команды или программы. Если команда или программа сохраняют историю и имеют функцию отмены, возможно, это можно использовать, но сама оболочка не может.

Например, если вы запустите rm important_file.txt, это скажет драйверу файловой системы «отсоединить» файл в файловой системе. Оболочка не выполняет действие, она только вызывает, rmкоторый выполняет.

В случае необходимости восстановления потерянного файла, это может быть возможно, так как обычно удаление файла фактически не удаляет его, а только удаляет ссылку на него. Через некоторое время содержимое файла будет перезаписано, так как другие данные будут сохранены на диске, но на некоторое время исходный файл может быть восстановлен с помощью утилит, которые могут найти и «связать» его.

wraeth
источник
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

Оливье Дюлак
источник