意外使用 sh 运行 perl 脚本,如何检测并采取行动?

意外使用 sh 运行 perl 脚本,如何检测并采取行动?

我有一个 bash-backup 脚本,它对我来说工作得很好,但现在我需要一些功能并将它们放入 perl 脚本中。它工作得很好,我很高兴。但我的肌肉记忆总是想输入“sh backup”而不是“perl backup”(或使用“./backup”或类似的东西)。我碰巧从“sh backup”开始,现在我几乎无法摆脱它了。

我的想法是这样的:

有一个模块 cleverfilter.pm:

package cleverfilter;
use Filter::Simple;
FILTER {
    s/perl backup; exit;//g;
};
1;

这是我的备份脚本:

#!/usr/bin/perl

use cleverfilter;

perl backup; exit;

use strict;
use warnings;
...

其背后的想法是,perl 脚本会(通过过滤器)删除“perl backup; exit;”部分,但 bash 不会。Perl 可以正常运行,而 bash 会将此脚本作为 perl 脚本运行。

但是 Filter::Simple 似乎有一个问题:它过滤了所有内容它是模块使用。这就是为什么我需要把它放在“perl 备份”行的顶部。现在,当我用 perl 运行它时,它运行得很好。用 bash 运行它,显然会给我带来这些问题:

backup: 3: backup: use: not found

当然,我可以在某处创建一个空程序“使用”,忽略所有传入的参数,但这不是一个好的解决方案。

所以,我的问题是:有没有办法编写一些脚本部分,这些脚本部分将由 bash 执行,但不由 perl 执行?某种注释,例如,像 HTML 中那些奇怪的 IE 样式注释标签?

或者有更好的解决方案吗?我还没有想到更简单的方法吗?

答案1

一种选择是使用perl -x如下选项:

#!/bin/bash
perl -x "$0"
exit
#!/bin/perl
#perl code goes here

在我的系统上,它适用于 sh 或 perl。

相关内容