客观的
每当我使用mv
(或类似性质的命令)时,我希望我的 shell 提示我类似“嘿,你使用了 mv。对不起,但使用 mv -i 再做一次”。我想知道完成这种交互的合理方法。
目的是让我的电脑每次使用都会抱怨,mv
所以我必须重新输入mv -i
. 这样我就会发展肌肉记忆进入mv -i
。
让我的电脑在引擎盖下转换我mv
的不是目的,并且完全违背了意图。mv -i
如果这听起来像是一个愚蠢的想法,我想知道为什么和更好的解决方案。
背景
在过去,我曾使用mv
并错误地覆盖了文件。虽然此评论建议以mv
实际工作方式使用别名,但mv -i
我同意此评论关于此类自定义的后果。与其习惯打字mv
,我宁愿养成打字的习惯,mv -i
这样我就不会在其他机器上搞砸了。
关注点
我担心此类修改会影响调用mv
. mv
有没有一种聪明的方法来中止并仅在我自己通过键入并按 Enter 执行时才显示提示?
笔记
- 我备份文件,而不是相关的
- 我知道我可以在我的桌子上贴便利贴或在墙上贴海报以提高认识
- 环境:Debian、XFCE、xfce4-terminal、Bash
我会使用一个包装函数:你可以将它添加到你的 .bashrc (未经测试)
最简单的方法是创建别名。
更复杂但更可定制的方法是创建一个
mv
shell 脚本,将其放入/bin
,然后真正mv
移动到/sbin
或任何其他“秘密”目录。替换脚本将发出警告并mv
通过完整路径调用原始脚本。如果您想完全拯救自己
mv
- 重命名或删除该工具。是的,其他脚本可能会由于此类修改而失败。在这种情况下,您可以进入这些脚本并修复它们,方法是替换
mv
为/secret/path/mv
另一种方式 - 为日常生活创建一个特殊的用户。为他(通常在)创建一个排除危险工具
$HOME/bin
的真实副本。/bin
为该日常用户设置一个 PATH 将使用/home/everyday/bin
而不是/bin
.如果某些应用程序现在需要“危险”工具——该应用程序不适合“日常”用户——切换到具有更多权限的用户。
虽然@glennJackman使用包装器的方法检查第一个参数是否以开头
-
并包含i
在大多数常见情况下可能已经足够好,但在某些情况下它会失败:mv --help
(不是--version
包含-i
)。-i
inmv -v -i a b
(或者当环境中没有时mv a b -i
GNU允许的)。mv
POSIXLY_CORRECT
mv --interactive
//mv --in
...mv --i
-i
了mv --no-target-dir a b
或mv -Tdir file
...对于涵盖所有这些情况的包装器,我们需要它以相同的方式解析其选项
mv
。没有两个实现以相同的方式解析它们的选项。您甚至会发现相同mv
实现的版本之间的差异。mv
(和大多数实用程序)的 GNU 实现将用于getopt_long()
解析它们的选项。如果您的包装器可以
getopt_long()
使用相同的参数调用,我们将被排序。这留下了两个问题:getopt_long()
在shell中找到一个接口mv
传递给getopt_long()
如果您在 GNU/Linux 系统上,有可能的方法。
getopt_long()
虽然在 GNU 工具箱中没有 shell CLI ,但在util-linux
: 它与andgetopt
一起使用时的实用程序中有一个。-o
-l
在 GNU/Linux 上,GNU 实用程序将从
getopt_long()
libc 调用该函数,因为它将是 GNU libc,因此您可以使用ltrace
which traces library calls 来查看解析选项的getopt_long()
调用。mv
(
-:
保证是一个虚假的选择)不够好,因为我们只看到了空头选项。然而,可以配置
ltrace
为在那里解码long_options
参数,甚至隐藏我们不关心的参数。作为概念证明,这里有一个 zsh 脚本,它会
sh
为包装函数输出兼容代码,该函数在调用之前检查-i
/--interactive
(或--help
/--version
)或其缩写mv
:例如,在我的系统上,
that-script mv rm
输出:你会这样做:
在您的 shell 的交互模式配置中 (
~/.zshrc
,~/.bashrc
...)。定义那些包装器。接着: