我可以确定是否从终端运行 Perl 脚本吗?

2024-04-15

我可以确定是否从终端运行 Perl 脚本吗?

如果我不确定的话,我宁愿默认假设它是从浏览器运行的。但如果有一种方法可以确保它 100% 是从终端运行的,我会很高兴(出于调试目的)。


这是直接取自 ExtUtils::MakeMaker 的源代码prompt功能。我想,有人可能会想尽一切办法来欺骗它。但在某些时候,破坏者必须拥有破坏者的所有权。

对于大多数目的来说,这应该足够了:

 my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;

首先,它检查 STDIN 是否向 TTY 打开。如果是,请检查 STDOUT 是否为。如果 STDOUT 不是,则它也不能打开到文件或字符特殊文件。

Update:

IO::Prompt::Tiny 使用以下内容:

# Copied (without comments) from IO::Interactive::Tiny by Daniel Muey,
# based on IO::Interactive by Damian Conway and brian d foy

sub _is_interactive {
    my ($out_handle) = ( @_, select );
    return 0 if not -t $out_handle;
    if ( tied(*ARGV) or defined( fileno(ARGV) ) ) {
        return -t *STDIN if defined $ARGV && $ARGV eq '-';
        return @ARGV > 0 && $ARGV[0] eq '-' && -t *STDIN if eof *ARGV;
        return -t *ARGV;
    }
    else {
        return -t *STDIN;
    }
}

IO::Interactive::Tiny 添加了注释来解释发生了什么:

sub is_interactive {
    my ($out_handle) = (@_, select);    # Default to default output handle

    # Not interactive if output is not to terminal...
    return 0 if not -t $out_handle;

    # If *ARGV is opened, we're interactive if...
    if ( tied(*ARGV) or defined(fileno(ARGV)) ) { # IO::Interactive::Tiny: this is the only relavent part of Scalar::Util::openhandle() for 'openhandle *ARGV'
        # ...it's currently opened to the magic '-' file
        return -t *STDIN if defined $ARGV && $ARGV eq '-';

        # ...it's at end-of-file and the next file is the magic '-' file
        return @ARGV>0 && $ARGV[0] eq '-' && -t *STDIN if eof *ARGV;

        # ...it's directly attached to the terminal 
        return -t *ARGV;
    }

    # If *ARGV isn't opened, it will be interactive if *STDIN is attached 
    # to a terminal.
    else {
        return -t *STDIN;
    }
}

我已经验证了 IO::Interactive 中的逻辑与 IO::Interactive::Tiny 的逻辑相同。因此,如果您的目标是在适当的情况下进行提示,请考虑使用 IO::Prompt::Tiny。如果您的需求比 IO::Prompt::Tiny 支持的更细致,您可以使用 IO::Interactive::Tiny 来提供此特定功能。

虽然您使用自己的解决方案可能基本上是安全的,但使用这些 CPAN 模块之一的一个优点是,它们可能会得到积极维护,并且如果结果证明它们不足以达到其宣传的目的,则会收到报告和最终更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以确定是否从终端运行 Perl 脚本吗? 的相关文章

随机推荐

  • 检查 DataGridView 上的所有复选框项目

    这是场景 I have checkbox 名称 检查全部 ID chkItems 和datagridview 当我单击此复选框时 上的所有复选框datagridview也会被检查 我还在网格上添加了复选框列 DataGridViewChec
  • 需要了解Android中的uses-feature

    uses feature按以下方式使用
  • 可以将此处结果上的匹配替换为map_err和“?”

    我有一些代码看起来像这样 大大简化的版本 一个函数接受两个类型的函数参数LoadClient and CheckApproval并返回错误或字符串 pub struct Client pub id String pub enum MyErr
  • Json.NET 可以对流进行序列化/反序列化吗?

    我听说 Json NET 比 DataContractJsonSerializer 更快 并且想尝试一下 但我在 JsonConvert 上找不到任何采用流而不是字符串的方法 例如 为了在 WinPhone 上反序列化包含 JSON 的文件
  • Google 脚本检查一张纸上一列中的数据是否与另一张纸上另一列中的数据相同

    我正在尝试创建一个 Google 脚本来检查一张纸上一列中的数据是否与另一张纸上另一列中的数据相同 您知道我哪里出错了吗 谢谢 代码如下 function myFunction data from Salesworks var sheet
  • CSS 中的逗号,使用相同 CSS 的多个选择器

    Resource table Tbl td some css Resource table Tbl td num some css 2 Resource table Tbl td num span icon some css 3 Resou
  • x >= 0 比 x > -1 更有效吗?

    在 C 中与 int 进行比较是x gt 0比更有效率x gt 1 简短的回答 不 更长的答案提供一些教育见解 这完全取决于您的编译器 尽管我打赌每个理智的编译器都会为这两个表达式创建相同的代码 示例代码 int func ge0 int
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • 列出目录和子目录中的所有 xml 文件

    我想列出目录及其子目录中的所有 xml 文件 我尝试了 ls LR 但无法过滤除 xml 之外的其他文件 我想要类似 ls LR 的东西grep xml Thanks 您可以使用find命令 find type f name xml
  • Microsoft Graph API 更新其他用户的照片?

    使用 Microsoft Graph API 我能够获取 Azure Active Directory 租户中所有用户的列表 并确定他们是否有个人资料图片 然后 我想获取没有照片的用户列表并为他们上传一张 但 API 返回 403 错误 即
  • MVC5 通过流畅验证比较两个可为空的日期

    如何在流畅的验证中编写规则来检查两个可为空的日期 因为开始日期需要早于结束日期 我正在思考 RuleFor c gt c StartDate NotEmpty 如果开始日期不为空且结束日期不为空则进行比较 像这样的东西 RuleFor ac
  • HTML 中的 JavaScript 和 SVG [重复]

    这个问题在这里已经有答案了 我有 JavaScript 文件 我有 SVG 文件 我还有 HTML 文件 img src svgfile svg type 有人知道如何在 JavaScript 中调用 SVG 元素吗 以圆圈为例 如果您想使
  • 约束接口中的函数参数

    在接受函数的接口中约束函数参数的语法是什么 我试过 interface Num a gt Color f a gt Type where defs 但它说Name a is not bound in interface Your inter
  • 如何在不删除数据库文件的情况下完全清除SQLite3数据库?

    出于单元测试的目的 我需要完全重置 清除 SQLite3 数据库 运行测试套件时 所有数据库都是在内存中创建的 而不是在文件系统上创建的 因此我无法删除任何文件 此外 一个类的多个实例将同时引用数据库 因此我不能只在内存中创建一个新数据库并
  • 如何在 C# 中构建具有未指定参数数量的方法

    这是我的代码 private static string AddURISlash string remotePath if remotePath LastIndexOf remotePath Length 1 remotePath retu
  • 将前四个列表项移至列表末尾

    所以我有一个包含几个的列表 li 元素 ul li a li li b li li c li li d li li e li li f li li g li li h li ul 上下文是我想重用liiOS 的 1 000 个内存密集型列表
  • 从 java.sql.ResultSet 检索列名

    With java sql ResultSet有没有办法获取列的名称String通过使用列的索引 我查看了 API 文档 但找不到任何内容 您可以从以下位置获取此信息ResultSet元数据 看结果集元数据 https docs oracl
  • 是否有记录的方法来设置 iPhone 方向?

    我有一个应用程序 我想在某些视图中支持设备旋转 但其他视图在横向模式下特别有意义 因此当我交换视图时 我想强制将旋转设置为纵向 UIDevice 上有一个未记录的属性设置器可以实现这一点 但显然会生成编译器警告 并且可能会随着 SDK 的未
  • 如何从 xarray 数据集中选择特定数据变量

    背景 我正在尝试通过 xarray 和 OPeNDAP 下载 GFS 天气数据 netcdf4 文件 非常感谢涡度0123 https stackoverflow com questions 52406826 load selection
  • 我可以确定是否从终端运行 Perl 脚本吗?

    我可以确定是否从终端运行 Perl 脚本吗 如果我不确定的话 我宁愿默认假设它是从浏览器运行的 但如果有一种方法可以确保它 100 是从终端运行的 我会很高兴 出于调试目的 这是直接取自 ExtUtils MakeMaker 的源代码pro