【问题标题】:csh - suppress STDERR when using backtickscsh - 使用反引号时抑制 STDERR
【发布时间】:2017-02-22 05:10:34
【问题描述】:

我想写一段像这样的代码:

while ( `ls -1 ${JOB_PREFIX}_${job_counter}_*.out | wc -l` > 0 )
   echo "Do something here." 
end

但每次没有ls -1 ${JOB_PREFIX}_${job_counter}*.csh 时都会产生烦人的ls: No match.

是否可以抑制此错误消息但仍将 STDOUT 传递到 wc ?我已经解决了有关此问题的现有问题,但大多数答案要么不适用于csh,要么尝试将STDOUT 和STDERR 与|& 结合起来,这是我不想要的。

【问题讨论】:

    标签: stdout stderr csh backticks


    【解决方案1】:

    最干净的方法是将ls 本身静音,但这是不可能的。
    您可以隐藏整个脚本,这意味着:
    如果您的循环位于一个名为 myscript.cs 的文件中,并且您使用一些参数 myscript.cs -arg1 blabla -arg2 bla 调用您的文件,则将 >& 添加到您的 shell 命令以将 stderr 重定向到您想要的任何位置。例如
    myscript.cs -arg1 blabla -arg2 bla >& /dev/null

    它不是直接回答你的答案,但它应该可以解决你的问题。

    编辑
    由于注释添加了脚本应重定向到另一个脚本,因此您可以将您的行拆分为两行:

    如果 `ls -1 ${JOB_PREFIX}_${job_counter}_*.out >& /dev/null` 那么
    而
    结束
    结束

    【讨论】:

    • 不幸的是,这并不能解决问题,因为脚本的输出通过管道传输到另一个脚本并发送到日志文件,所有这些都会有同样的问题。我真的很想要一个能够有效抑制ls 的解决方案。
    • 看看stackoverflow.com/questions/42261228/… 我在那里回答了一个非常相似的问题
    【解决方案2】:

    csh 和 tcsh 无法自行重定向 stderr,这是您不应将其用于脚本编写的众多原因之一。

    如果您可以生成另一个 shell,您可以将 JOB_COUNTER 更改为环境变量并执行以下操作:

    while ( `sh -c '2>/dev/null ls -1 ${JOB_PREFIX}_${JOB_COUNTER}_*.out | wc -l'` > 0 )
       echo "Do something here." 
    end
    

    如果您想在while 循环中使用测试作为条件而不是表达式,您必须要有创意。

    #!/bin/tcsh -f
    set i = 4
    while ( 1 )
        if ( $i <= 0 ) break 
        echo hi
        @ i = ($i - 1)
    end
    

    在您的情况下,这可能类似于:我将 wc -l 更改为 grep -q .,以便我们可以使用退出状态而不是打印到 stderr 的结果。

    #!/bin/tcsh -f
    
    set dir_exit_status = 0
    while ( $dir_exit_status = 0 )
        ( ls -1 ${JOB_PREFIX}_${job_counter}_*.out | grep -q '.') >& /dev/null
        set dir_exit_status = $status
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2012-11-15
      • 2015-11-07
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多