在最近的某个时候,科幻迷们开始了一年一度的 星球大战 5 月 4 日 庆祝活动,这是对绝地武士祝福语 “May the Force be with you(愿原力与你同在)” 的双关语。虽然大多数 Linux 用户可能不是绝地武士,但他们仍然有使用原力的方法。当然,如果尤达只是简单地告诉卢克输入 man X-Wing fighter 或 man force,或者他说 “RTFM”(当然,是 Read the Force Manual,阅读原力手册),这部电影可能就不会那么令人兴奋了。
许多 Linux 命令都有一个 -f 选项,它代表,你猜对了,force(强制)!有时,当你执行一个命令时,它会失败或提示你输入额外的输入。这可能是为了保护你试图更改的文件,或者告知用户设备正忙或文件已存在。
如果你不想被打扰提示,或者不在意错误,请使用 force(强制)!
请注意,使用命令的 force 选项来覆盖这些保护措施通常是具有破坏性的。因此,用户需要密切关注,并确保他们知道自己在做什么。使用 force 可能会产生后果!
以下是四个带有 force 选项的 Linux 命令,以及关于如何以及为何你可能想要使用它们的简要描述。
cp
cp 命令是 copy(复制)的缩写—它用于复制(或克隆)文件或目录。手册页 将 cp 的 force 选项描述为
-f, --force
if an existing destination file cannot be opened, remove it
and try again
此示例适用于当你处理只读文件时
[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 13 May 1 12:24 Hoth
-r--r----- 1 alan alan 14 May 1 12:23 Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet
Green Planet
如果你想将名为 Hoth 的文件复制到 Naboo,cp 命令将不允许这样做,因为 Naboo 是只读的
[alan@workstation ~]$ cp Hoth Naboo
cp: cannot create regular file 'Naboo': Permission denied
但是通过使用 force,cp 将不会提示。Hoth 的内容和权限将立即被复制到 Naboo
[alan@workstation ~]$ cp -f Hoth Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet
Icy Planet
[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 12 May 1 12:32 Hoth
-rw-rw---- 1 alan alan 12 May 1 12:38 Naboo
哦不!我希望他们在纳布有冬季装备。
ln
ln 命令用于创建文件之间的链接。手册页 将 ln 的 force 选项描述为
-f, --force
remove existing destination files
假设莉亚公主正在维护一个 Java 应用程序服务器,并且她有一个目录存储所有 Java 版本。这是一个例子
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 Mar 5 2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
正如你所看到的,有几个版本的 Java 开发工具包 (JDK) 和一个指向最新版本的符号链接。她使用一个带有以下命令的脚本来安装新的 JDK 版本。但是,如果没有 force 选项,或者除非 root 用户运行它,否则它将无法工作
tar xvzmf jdk1.8.0_181.tar.gz -C jdk1.8.0_181/
ln -vs jdk1.8.0_181 jdk
tar 命令会将 .gz 文件解压到指定的目录,但是 ln 命令将无法升级链接,因为链接已经存在。结果将是链接不再指向最新的 JDK
leia@workstation:/usr/lib/java$ ln -vs jdk1.8.0_181 jdk
ln: failed to create symbolic link 'jdk/jdk1.8.0_181': File exists
leia@workstation:/usr/lib/java$ ls -lt
total 28
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
lrwxrwxrwx 1 leia leia 12 Mar 5 2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
她可以通过传递 force 选项和另一个选项 -n 来强制 ln 正确更新链接。需要 -n 是因为链接指向一个目录。现在,链接再次指向最新的 JDK
leia@workstation:/usr/lib/java$ ln -vsnf jdk1.8.0_181 jdk
'jdk' -> 'jdk1.8.0_181'
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 May 1 16:13 jdk -> jdk1.8.0_181
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
可以将 Java 应用程序配置为使用路径 /usr/lib/java/jdk 查找 JDK,而无需每次 Java 更新时都更改它。
rm
rm 命令是 “remove”(删除)的缩写(我们通常称之为 delete,因为其他一些操作系统有一个 del 命令来执行此操作)。手册页 将 rm 的 force 选项描述为
-f, --force
ignore nonexistent files and arguments, never prompt
如果你尝试删除一个只读文件,rm 将会提示你
[alan@workstation ~]$ ls -l
total 4
-r--r----- 1 alan alan 16 May 1 11:38 B-wing
[alan@workstation ~]$ rm B-wing
rm: remove write-protected regular file 'B-wing'?
你必须键入 y 或 n 来回答提示,并允许 rm 命令继续执行。如果你使用 force 选项,rm 将不会提示你,并将立即删除该文件
[alan@workstation ~]$ rm -f B-wing
[alan@workstation ~]$ ls -l
total 0
[alan@workstation ~]$
force 与 rm 最常见的用法是删除目录。-r(递归)选项告诉 rm 删除目录。当与 force 选项结合使用时,它将删除目录及其所有内容,而无需任何提示。
带有某些选项的 rm 命令可能是灾难性的。多年来,在线论坛上充斥着用户完全擦除其系统的笑话和恐怖故事。这种臭名昭著的用法是 rm -rf *。这将立即删除所有文件和目录,而无需在任何使用它的地方进行任何提示。
userdel
userdel 命令是 user delete(用户删除)的缩写,它将删除一个用户。手册页 将 userdel 的 force 选项描述为
-f, --force
This option forces the removal of the user account, even if the
user is still logged in. It also forces userdel to remove the
user's home directory and mail spool, even if another user uses
the same home directory or if the mail spool is not owned by the
specified user. If USERGROUPS_ENAB is defined to yes in
/etc/login.defs and if a group exists with the same name as the
deleted user, then this group will be removed, even if it is
still the primary group of another user.
Note: This option is dangerous and may leave your system in an
inconsistent state.
当欧比旺到达穆斯塔法的城堡时,他知道必须要做什么。他必须删除达斯的账户——但达斯仍然登录着。
[root@workstation ~]# ps -fu darth
UID PID PPID C STIME TTY TIME CMD
darth 7663 7655 0 13:28 pts/3 00:00:00 -bash
[root@workstation ~]# userdel darth
userdel: user darth is currently used by process 7663
由于达斯当前已登录,欧比旺必须使用 userdel 的 force 选项。即使帐户已登录,这也将删除用户帐户。
[root@workstation ~]# userdel -f darth
userdel: user darth is currently used by process 7663
[root@workstation ~]# finger darth
finger: darth: no such user.
[root@workstation ~]# ps -fu darth
error: user name does not exist
正如你所看到的,finger 和 ps 命令确认用户达斯已被删除。
在 shell 脚本中使用 force
许多其他命令都有 force 选项。force 非常有用的一个地方是在 shell 脚本中。由于我们在 cron 作业和其他自动化操作中使用脚本,因此避免任何提示至关重要,否则这些自动化过程将无法完成。
我希望我上面分享的四个示例能够帮助你理解某些情况下可能需要使用 force。当在命令行或创建自动化脚本中使用 force 选项时,你应该对此有一个深刻的理解。它的误用可能会产生灾难性的影响——有时会遍及你的基础设施,而不仅仅是在一台机器上。
4 条评论