可以在bash shell中反转命令吗?


12

我想知道是否有(简单)重做/撤消在bash shell中执行的命令的可能性?(使其撤消)

是否有类似于ctrl+ z组合的东西来重做任何操作(例如在word或LibreOffice中)?


8
简短的答案是没有。某些命令可能会还原,但是没有这种通用的撤消操作。
Archemar

3
就像其他人所说的那样,没有undo命令,因此对整个操作系统进行最新备份确实很有用。当出现问题时,您只需恢复以前的状态即可。看看rsnapshot例如
的Arkadiusz Drabczyk

1
我想找到一种方法来撤消halt -p命令
Skaperen

3
@Joshua使用可以破坏用户数据并且没有解释的命令发布评论是不可接受的行为。这很有趣,它使网站混乱,最重要的是,这很危险。别再那么做了。
terdon

2
我想撤消shutdown命令大声笑..不敢相信这样的问题一天也可以得到8票!!
MagExt

Answers:


33

您应该了解这bash只是一个执行环境。它执行您调用的命令-甚至不知道命令的用途与Shell无关,您都可以调用所需的任何可执行文件。在大多数情况下,甚至还不清楚撤消操作的内容-例如,您可以“取消播放”电影吗?您可以“取消发送”电子邮件吗?例如,“撤消运行Firefox”甚至意味着什么?您可以关闭它,但书签,下载和历史记录将不同。

如果运行命令,则无论执行什么命令,该命令都会被执行。取决于您自己在做什么。请注意,这并不意味着单个命令没有“撤消” ...它们可以-您甚至可以编写包装器函数来保护您免受愚蠢错误的影响。

例如,mv只要将文件移回原始位置即可轻松实现可逆性,除非您覆盖了某些内容。这就是为什么-i存在开关,要在覆盖之前询问您的原因。从技术上讲,的反转cprm,除非某些内容被覆盖(再次-i询问您有关此内容的信息)。rm更永久,要尝试取回文件,您实际上必须进行一些较低级别的黑客攻击(有相应的工具)。如果您将文件系统视为黑匣子,从技术上讲是根本不可能的(只有数据逻辑和物理布局的详细信息才能使您进行一些损害控制)。rm意味着rm,如果您想要“垃圾桶”功能,那实际上就是mv进入一些预先安排的目录(可能还有一个安排好的服务来维护或清空它)-没什么特别的。但是您可以-i在删除前使用提示来提示您。您可以使用函数或别名始终包含-i在这些命令中。

请注意,大多数应用程序都以不同的方式保护您免受数据丢失的影响。多数(〜全部)文本编辑器会~在最后创建备份文件,以防您想将旧版本带回。在某些发行版中,ls默认情况下使用别名别名,以便将其隐藏(-B),但是它们在那里。通过适当地管理权限可以提供很多保护:除非需要,否则不要为root用户;如果不想更改文件,则将它们设置为只读。有时,拥有一个“沙盒”环境很有用-在副本上运行事物,看看它是否还好,然后合并更改(或放弃更改)。chrootlxc可以防止您的脚本从目录中逸出并造成损害。

当您尝试批量执行事务时(例如,如果您有一个复杂的find命令,while循环,较长的管道或类似的操作),最好先仅echo执行将要执行的命令。然后,如果命令看起来合理,请删除echo并运行它。当然,如果您不确定自己在做什么,请先制作一份副本。有时我只是创建当前目录的tarball。

说到tarball,不幸的是,tarbomb和zipbombs很普遍(当人们没有适当的子目录进行归档时,解压缩会使文件散落在周围,从而造成极大的混乱)。我习惯于在解包之前自己制作一个子目录(我可以列出内容,但我很懒)。我正在考虑制作一个仅在内容没有子目录的情况下创建子目录的脚本。但是,当确实发生这种情况时,ls -lrt有助于查找最新文件以放置它们所属的位置。我只是以一个例子为例-一个程序可能有很多副作用,而Shell对此是一无所知的(怎么可能呢?这是另一个与众不同的程序!)避免错误的唯一肯定方法是要小心(考虑一下)两次,运行一次)。

可能最危险的命令是处理文件系统的命令:mkfs,fdisk / gdisk等。它们会彻底破坏文件系统(尽管使用适当的取证软件,至少可以进行部分反向工程)。在运行命令之前,请始终仔细检查要格式化和分区的设备是否正确。


14

不,对不起,在Bash中没有“撤消”之类的事情。这就是为什么您应该仔细检查命令或首先在不重要的文件上测试它们的原因(如果可能的话)。并三重检查您是否以root用户身份进行操作;)


1
Ctr + /在bash终端中对某些控制命令执行撤消操作,但并非所有命令都是可撤消的。
埃里克·莱斯钦斯基

@EricLeschinski您能提供参考吗?
Erathiel

它埋在此页面的回复评论中:skorks.com/2009/09/bash-shortcuts-for-maximum-productivity为了查看其工作原理,请在终端上键入一些文字。将光标移到某个字符上,按Ctrl-d在该字符下删除,然后按Ctrl + /撤消删除。
埃里克·莱斯钦斯基

1
哦,但这与撤消命令有根本的不同。如果您使用删除文件rm,则该文件已消失,已逝世,已故,不再存在,它是一个前文件(Monty Python警报)。现在,它的亲戚们在悲伤中哭泣,你无法撤消你的行为。您正在谈论的是撤消键入或删除字符,我怀疑这是终端仿真器的功能。我刚刚在《终结者》中尝试过,并且可以正常工作。切换到其他控制台(在我的情况下为Ctrl + Alt + F1)将使其无法正常工作。
Erathiel

有终端命令输入撤消,执行后有终端命令撤消。我来到这里寻找前者。
Eric Leschinski

11

不,没有通用撤消,但是某些后果比其他后果更可逆。例如rm:它本质上有两个用途-避免混乱,并释放新文件的空间。幸运的是,您可以使用诸如之类的工具来检索文件的内容extundelete,因为在运行时,只有指向文件开头的指针会被覆盖rm;当操作系统重用该空间时,内容将被覆盖(这可能会在数毫秒或数年后发生)。因为这个功能的,rm落在中间规模的系统或多或少破坏性的。一方面有垃圾系统,它提供了一种避免混乱的方法,而不会立即丢失数据(因为撤消很简单)。更为保守的是一次写入,多次读取(“ WORM”)系统,在这些系统中,系统对其进行写入不能随意删除或覆盖数据。另一方面,是切碎系统,该系统除指针外还覆盖文件内容(通常是多次)。到那时,用于恢复数据的技术可能甚至不存在(可能永远不存在)。

因此,您可以看到使用最多的特定工具(rm)并不是唯一的选择,但它为大多数人似乎很满意的产品提供了一个折衷方案:

  • 删除文件指针的速度非常快,并且对磁盘恶化的贡献很小。
  • 您不太可能在高度自动化的系统上用完空间
  • 提供非常适度但非零的隐私保护,反之则提供恢复保证
  • 低复杂度,因此错误或意外行为的可能性低

如果您的工具无法做出的取舍,请环顾四周。可能有一些工具可以做出适合的决策。


3
该答案中唯一可以解决该问题的部分是第一行
Alvaro

只是试图从sysadmin的角度解释为什么会这样。
l0b0

9

提供“撤消”功能的应用程序通过维护已执行操作的历史记录以及恢复操作或对象状态的快照以恢复先前状态的方法来做到这一点。在Shell中执行的命令执行直接动作或执行命令以执行动作。

Shell本身无法撤消已运行的任何命令或程序所导致的操作。如果命令或程序保留了历史记录并具有撤消功能,则可以使用该功能,但Shell本身不能。

例如,如果您运行rm important_file.txt,它将告诉文件系统驱动程序“取消链接”文件系统上的文件。外壳程序不执行操作,仅调用执行操作rm

如果要取消删除丢失的文件,则可能会这样做,因为通常删除文件并不会真正删除它,而只会删除对其的引用。一段时间后,文件的内容将被覆盖,因为其他数据已保存到磁盘,但是一段时间后,可以使用可以找到并“重新链接”该文件的实用程序来还原原始文件。


1

不,没有,但是,如果说您混淆了特权目录的根目录并以某种方式搞砸了,那么最好的选择是将所有文件保存到USB驱动器或SD卡中,然后从ISO文件(如果仍然有,则可以使另一个脱机...)。如果你删除的东西就可以了,如wraeth说,下载应用程序,以重新链接文件数据的文件名,并有内容保存的文件(见这里的问题)。有关更深入的答案,您能告诉我们您做错了什么吗?


1

我不会重复别人说的话,但是我可以从你来的地方看到。我执行“危险”命令的标准方法始终是回显它们,以查看所有变量是否都已正确扩展。如果您可以引用某些特定实例,我们也许可以提供进一步的帮助。

例如,在类似情况下:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.