当默认行为已经覆盖文件时 mv -f 有什么意义?

当默认行为已经覆盖文件时 mv -f 有什么意义?

GNU Coreutils 手册mv说:

-f --force Do not prompt the user before removing a destination file.

然而,这似乎已经是 的默认行为mv,因此该-f选项似乎是多余的。例如,在 GNU Bash 版本 4.3.11 中:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

该标志的意图似乎不太可能-f是覆盖alias mv="mv -i",因为有几种标准方式覆盖别名(例如使用\mv)可以更简洁地执行此操作,并且以跨命令一致的方式执行此操作。

该手册指出,“如果您指定多个 -i、-f、-n 选项,则只有最后一个选项生效”,但该-f标志的意图似乎仍然不太可能是-i一般情况下覆盖该标志,因为只需使用即可实现等效行为mv,这比使用更加简洁和易于理解mv -if

既然如此,那么-f国旗的用途是什么呢?它为何存在?

答案1

的用法-f更清楚地描述在手册页从 4BSD 开始,添加了-f-i选项:

如果文件2已经存在,之前已删除文件1被感动了。如果文件2有一个禁止写入的模式,mv 打印该模式并读取标准输入以获取一行;如果该行以 y 开头,则移动发生;如果没有,mv 退出。

选项:

-i代表交互模式。每当移动要取代现有文件时,系统都会提示用户文件名,后跟问号。如果他回答以“y”开头的行,则移动继续。任何其他答复都会阻止移动发生。

-f代表力量。此选项会覆盖任何模式限制或-i开关。

mv 如何运行的更精确的定义在POSIX标准,它补充说,仅当它稍后出现在命令行中时-f才会覆盖。-i

所以默认行为与-f.默认情况下,仅当目标不可写时才要求确认。 (这种行为至少可以追溯到V4,其中mv没有采取任何选项。)如果-i给出了选项,只要目标存在,mv 就会额外要求确认。该-f选项将禁止在这两种情况下询问(如果它发生在任何之后-i)。

答案2

当将执行设置mv为合理的默认值时,它很有用:

alias mv="mv -i"

当你想要强制移动时,这将起作用:

mv -f

因为它是扩展命令中的最后一个选项:

mv -i -f

这一点在文中也提到了GNU Coreutils 手册

答案3

它的存在是因为(man mv

-i如果指定、-f、中的多个-n,则仅最后一个生效。

因此,您可以有一个始终询问的脚本/别名/函数,但您仍然可以覆盖该选项。

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

当然,有意义的函数/脚本会做更多事情(例如记录操作)。

答案4

在 shell 编程中,使用 -f 是一种常见的习惯用法,用于确保命令不会因错误而中止或在运行某些命令时要求脚本/用户进行交互式响应。您最不想看到的就是脚本暂停等待用户输入,或者更糟糕的是,错误的命令从标准输入中获取输入。

笔记:撤消别名可能会导致/消除副作用。如果您已将该命令别名为另一个版本或使用其他选项,则撤消别名将导致不必要的副作用。例如,您可能使用 mv 和 rm 进行别名设置以使用回收罐(或其他保护/跟踪系统)。撤销别名会破坏这个......

相关内容