【问题标题】:need perl to die when implicit open fails当隐式打开失败时需要 perl 死掉
【发布时间】:2020-02-15 12:02:50
【问题描述】:

我正在尝试将sed 脚本迁移到 perl 单行,因为 perl 支持非贪婪正则表达式。我听取了Non greedy (reluctant) regex matching in sed?Why is my Perl in-place script exiting with a zero exit code even though it's failing? 的建议

如果无法打开文件,我需要我的 oneliner 以非零状态退出。

很遗憾,检查-f $ARGV[0] 是不可靠的,因为该文件可能存在但仍然无法访问。

一个想法是在命令行中添加一些 perl 代码在所有文件之间执行,但我找不到。 END 执行一次,如果最后一个文件成功了,那么它就不会知道之前的文件失败了。

touch aaa.txt
chmod 000 aaa.txt
perl -i -pe 'BEGIN { -f $ARGV[0] or die "fatal: " . $!; }' aaa.txt; echo $?

_

Can't open aaa.txt: Permission denied.
0

【问题讨论】:

    标签: linux perl


    【解决方案1】:

    Can't open ... 文本是一个警告。您可以使用$SIG{__WARN__} 信号处理程序来捕获它。

    由于您应该得到的唯一警告来自 -p 开关提供的循环中的隐式 <> 运算符,因此您可以像这样重写代码

    perl -i -pe 'BEGIN { $exit = 0; $SIG{__WARN__} = sub { $exit = 1; warn @_} } END { $? = $exit}' aaa.txt; echo $?
    

    这会在脚本开始时将$exit 设置为 0,如果出现警告则将其设置为 1。 END 块将 $exit 的值分配给 $?,这将是脚本结束后的退出代码。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 2012-08-14
      • 1970-01-01
      • 2013-03-15
      • 2013-10-17
      • 2017-04-19
      • 2014-06-12
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多