舞台

我运行了一个脚本,该脚本将文件路径作为参数并写入该文件。首先,我使用 -h 标志运行它以查看是否可以获得帮助消息。没有错误消息打印到标准输出。然而,脚本随后做了一些意想不到的事情......

按下回车后,脚本继续执行并提示额外输入。我没有注意到并按了几次“输入”以获得干净的提示。这无意中让脚本完成。结果,我得到了一个名为“-h”的全新文件。哎呀。

删除文件很难......

没什么大不了的吧?

$> ls
-h

进入全屏模式 退出全屏模式

我们可以用一个简单的“rm”命令删除它

$> rm -h
rm: invalid option -- 'h'
Try 'rm ./-h' to remove the file '-h'.
Try 'rm --help' for more information.

进入全屏模式 退出全屏模式

什么...?

$> rm \-h
rm: invalid option -- 'h'
Try 'rm ./-h' to remove the file '-h'.
Try 'rm --help' for more information.
$>
$> rm "-h"
rm: invalid option -- 'h'
Try 'rm ./-h' to remove the file '-h'.
Try 'rm --help' for more information.
$>
$> rm '-h'
rm: invalid option -- 'h'
Try 'rm ./-h' to remove the file '-h'.
Try 'rm --help' for more information.
$>
$> rm '\-h'
rm: cannot remove '\-h': No such file or directory

进入全屏模式 退出全屏模式

这时,我疑惑地挠了挠头。但是,经过一些谷歌搜索后,我发现了一些简单的解决方案

$>rm ./-h
# or
$>rm -- -h

进入全屏模式 退出全屏模式

这些解决方案中的任何一个都有效。第一个有效,因为我们使用当前目录作为路径的一部分。这告诉 bash 不要将连字符作为选项处理。

最后,第二个选项有效,因为双连字符是 bash 内置的。它告诉命令没有更多选项要处理,其他任何东西都是位置参数。

总结

总之,我有一些经验教训:

1.实际看你的提示,然后再按回车

  1. 贝壳有很多细微差别。当您遇到它们时,值得花时间了解它们,因为您可能会再次遇到它们。

  2. 在你的脚本中使用“set -e”。如果出现错误,脚本将退出而不是继续执行。

Logo

更多推荐