【问题标题】:Incorrect command-line perl error value in $?$? 中的命令行 perl 错误值不正确?
【发布时间】:2015-05-10 17:38:52
【问题描述】:

我正在使用命令行 perl 在文件中执行就地替换。这是代码:(注意root perm 使用sudo)

sudo perl -i -pe "s/foo/bar/" config.txt

如果成功,'echo $?'返回 0。现在我使用这样的 chattr 使文件不可写,即使是 root 用户:

sudo chattr +i config.txt

我运行相同的 perl 命令,但失败并出现以下错误:

无法删除 config.txt:不允许操作,正在跳过文件。

这很好。然而,“回声$?”在这种情况下仍然返回 0。为什么会这样?它不应该返回一个指示错误的非零值吗?

【问题讨论】:

    标签: linux perl return-value


    【解决方案1】:

    问题是 Perl 不会在这种情况下返回非零退出状态(sudo 传递给定命令的退出状态),这有点令人烦恼。您可以通过识别如果文件重命名失败并使用标志处理它,则永远不会进入行读取循环来解决此问题:

    sudo perl -i -ne 's/foo/bar/; print; $wrk = 1; }{ $wrk or exit 1' config.txt
    

    爱斯基摩人问候(或蝴蝶)“运算符”}{ 在某种程度上引入了END 块;当从文件中读取行的循环结束时执行之后会发生什么。它的工作方式描述为here。

    需要注意的是,如果config.txt 为空,这也会报错。一个更短的方法是使用特殊的$. 行计数器变量来实现相同的目的:

    sudo perl -i -ne 's/foo/bar/; print; }{ $. or exit 1' config.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 2011-03-14
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多