csh - 使用反引号时抑制STDERR

时间:2017-02-22 05:10:35

标签: stdout stderr csh backticks

我想写一些看起来像这样的代码:

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上,要么尝试将STDOUTSTDERR与我不想要的|&结合起来。

2 个答案:

答案 0 :(得分:0)

最干净的方法是将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`然后
    而<你在这里>
  结束
  ENDIF

答案 1 :(得分:0)

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