当前位置: 首页 > 科技观察

在Linux命令行上使用“原力”

时间:2023-03-19 18:43:46 科技观察

就像绝地武士的原力一样,-f参数功能强大,具有潜在的破坏性,并且在您可以使用它时方便。近年来,科幻爱好者们开始在每年的5月4日庆祝星球大战日,口号是绝地武士的祝福“愿原力与你同在”。虽然大多数Linux用户可能不是绝地武士,但我们仍然可以使用原力。自然,如果尤达大师只是让卢克·天行者输入“manX-Wingfighter”,“manTheForce”,或者RTFM(读一下原力手册,肯定是那个意思),那这部电影一定不是什么意思。(LCTT译注:RTFM是“ReadTheFuckingManual”的缩写——阅读该死的手册)。很多Linux命令都有-f选项,意思是你现在肯定知道了,force(LCTT译注:force选项本意为“强制”)!很多时候您尝试先执行一个命令但它失败了,或者提示您添加更多选项。通常这是为了保护您试图更改的文件,或者告诉用户设备正忙或文件已经存在。如果你不想被这些提醒打扰或者根本不在乎,就用武力吧!但是要小心,通常使用force选项是破坏性的。所以用户一定要特别注意!并确保你知道自己在做什么!用原力承担后果!下面介绍一些常见的Linux命令的强制选项、它们的作用以及常见的使用场景。cpcp是“copy”的缩写,是用来复制文件或目录的命令。它的手册页说:-f,--force如果无法打开现有的目标文件,请将其删除并重试您可以使用它来处理只读文件:[alan@workstation~]$ls-ltotal8-rw-rw----1alanalan13May112:24Hoth-r--r-----1alanalan14May112:23Naboo[alan@workstation~]$catHothNabooIcyPlanetGreenPlanet如果你想复制一个名为Hoth的文件到Naboo,但是因为Naboo目前是只读的,所以cp命令不会执行:[alan@workstation~]$cpHothNaboocp:cannotcreateregularfile'Naboo':Permissiondeniedbutbyusing强制,cp会强制执行。Hoth内容和文件权限直接复制到Naboo:[alan@workstation~]$cp-fHothNaboo[alan@workstation~]$catHothNabooIcyPlanetIcyPlanet[alan@workstation~]$ls-ltotal8-rw-rw----1alanalan12May112:32Hoth-rw-rw----1alanalan12May112:38Naboolnln命令用于在文件之间建立链接,其手册页描述强制选项如下如下:-f,–force删除当前存在的文件假设莱娅公主正在维护一个Java应用服务器,她有一个目录存放所有的Java版本,例如:leia@workstation:/usr/lib/java$ls-lttotal28lrwxrwxrwx1leialeia12Mar52018jdk->jdk1.8.0_162drwxr-xr-x8leialeia4096Mar52018jdk1.8.0_162drwxr-xr-x8.8leialeia17280j4096Aug_144如您所见,有很多版本JDK的,并且有一个指向JDK的符号链接。然后,她使用脚本安装JDK。但如果没有强制选项,以下命令将不会成功:tarxvzmfjdk1.8.0_181.tar.gz-Cjdk1.8.0_181/ln-vsjdk1.8.0_181jdktar命令会将.gz文件提取到特定目标目录,但ln命令将失败,因为链接已经存在。这样做的结果是符号链接不会指向JDK:leia@workstation:/usr/lib/java$ln-vsjdk1.8.0_181jdkln:failedtocreatesymboliclink'jdk/jdk1.8.0_181':文件existsleia@workstation:/usr/lib/java$ls-lttotal28drwxr-x---2leialeia4096May115:44jdk1.8.0_181lrwxrwxrwx1leialeia2018年3月5日jdk->jdk1.8.0_162drwxr-xr-x8leialeia4096Mar52018jdk1.8.0_162drwxr-xr-x8leialeia4096Aug282017jdk1.8.0_144她可以通过force选项强制ln更新链接,但是这里她还需要使用-n,-n是因为在这种情况下链接实际上指向目录而不是文件。在这种情况下,链接将正确指向JDK。leia@workstation:/usr/lib/java$ln-vsnfjdk1.8.0_181jdk'jdk'->'jdk1.8.0_181'leia@workstation:/usr/lib/java$ls-lttotal28lrwxrwxrwx1leialeia5月12日116:13jdk->jdk1.8.0_181drwxr-x---2leialeia40965月1日15:44jdk1.8.0_181drwxr-xr-x8leialeia40962018年3月5日jdk1.8.0_162drwxr-xr-x8leialeia4096Aug282017jdk1.8.0_144您可以将Java应用程序配置为始终使用位于/usr/lib/java/jdk的JDK,而不是每次升级时都进行更新。rmrm命令是“remove”(也称为删除,因为某些系统del命令也这样做)的缩写。其手册页对force选项的描述如下:-f,--force忽略不存在的文件或参数,不向用户确认。如果您尝试删除只读文件,rm将要求用户确认:[alan@workstation~]$ls-ltotal4-r--r-----1alanalan16May111:38B-wing[alan@workstation~]$rmB-wingrm:删除写保护的常规文件“B-wing”?您必须输入y或n进行确认,以便rm命令继续。如果您使用强制选项,rm会在不要求您确认的情况下删除文件:[alan@workstation~]$rm-fB-wing[alan@workstation~]$ls-ltotal0[alan@workstation~]$最rmforce选项的常见用途是删除目录。-r(递归)选项导致rm删除目录,当与force选项结合使用时,它会在没有用户确认的情况下删除文件夹及其内容。rm命令结合一些选项是致命的,网上一直流传着误用rm删除整个系统的笑话和鬼故事。比如最著名的一个,不小心执行了rm-rf。将直接删除目录和文件(无需用户确认)。(LCTT译注:真正做过的校对就这样没了~~回车前请再三确认:我是谁,我在哪里,我在做什么)userdeluserdel命令用于删除用户。它的手册页是这样描述它的强制选项的:-f,--force该选项将强制删除用户,即使用户当前已登录。它还将强制删除用户的目录和邮件存储,即使用户的目录被其他人共享或邮件存储不属于该用户。如果/etc/login.defs中的USERGROUPS_ENAB为yes,并且存在与该用户同名的组,则该组也会被移除,即使该组也是其他用户的主用户组。注意:此选项有风险,可能会使系统处于不稳定状态。当欧比旺到达穆斯塔法时,他知道自己的使命。他需要删除DarthVader的用户帐户——而Darth仍在其中。[root@workstation~]#ps-fudarthUIDPIDPPIDCSTIMETTYTIMECMDdarth76637655013:28pts/300:00:00-bash[root@workstation~]#userdeldarthuserdel:当前使用用户darthbyprocess7663由于Darth还在系统中登录,Obi-Wan需要使用force选项来操作userdel。这将强制删除当前登录的用户。[root@workstation~]#userdel-fdarthuserdel:用户darth当前被进程7663使用[root@workstation~]#fingerdarthfinger:darth:没有那个用户。[root@workstation~]#ps-fudarthror:用户名不存在如我们所见,finger和ps命令让我们确认Darth已被删除。在Shell脚本中使用Force许多命令都有force选项,它们在Shell脚本中特别有用。由于我们经常使用脚本来完成周期性或自动化任务,因此避免用户输入是至关重要的,否则自动化任务将无法完成。希望以上几个例子可以帮助大家理解一些需要用力的情况。在命令行上使用Force或将其写入脚本之前,您应该充分了解Force的作用。滥用原力可能会造成毁灭性的后果——通常是整个系统,甚至不仅仅是一台设备。