【问题标题】:Capture return code of Perl system command with redirection使用重定向捕获 Perl 系统命令的返回码
【发布时间】:2014-08-15 23:36:12
【问题描述】:

我正在尝试捕获system 调用的返回码。为简单起见,考虑一个您知道返回代码 1 的命令,例如以下 bash 脚本 t.sh

#! /bin/bash
exit 1

然后考虑:

use warnings;
use strict;
use feature qw(say);

my $res=system("t.sh");
say ($?>>8);

$res=system("t.sh &>/dev/null");
say ($?>>8);

打印出来的

1
0

为什么第二个system 调用(有错误重定向的那个)给了我一个零返回码?

【问题讨论】:

  • "&>" 应该是 "2>"。您正在后台运行命令,并获得 0 退出代码
  • 谢谢,但我正在尝试重定向标准输出和标准错误。请参阅gnu.org/software/bash/manual/html_node/Redirections.html。根据该页面,语法应该是 &> ?
  • 然后使用$res = system("t.sh > /dev/null 2>1")
  • 谢谢@Miller,这行得通! (很高兴知道为什么&> 不起作用,因为它在手册中给出)
  • @HåkonHægland &> 是一个相对较新的 Bash 功能(在 v4.x 中引入)。使用bash --version 检查您的版本; &> 在我的 v4.1.2 系统上正常工作。 &> 在语义上等价于>word 2>&1,所以你可以使用system('t.sh > /dev/null 2>&1');。注意2>&1 中的&;如果你不这样做,你将在当前目录中创建一个名为 1 的文件。

标签: perl


【解决方案1】:

我无法在 Bash v4.1.2 中复制您的问题:

$ perl -wE 'system( q{/bin/bash -c "true &> /dev/null"} ); say $? >> 8'
0
$ perl -wE 'system( q{/bin/bash -c "false &> /dev/null"} ); say $? >> 8'
1

但是,&> 重定向运算符不可移植,should generally be avoided。我不确定,但它似乎在早期版本中无法正常工作。*

以下语法在语义上是等效的,并且更便于移植:

>file 2>&1

(注意2>&1 中的&

改用它。


* 根据Advanced Bash Scripting Guide,“这个操作符现在可以正常工作了,从 Bash 4 的最终版本开始。”

【讨论】:

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