我想写一些看起来像这样的代码:
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
与我不想要的|&
结合起来。
答案 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