2017-02-22 115 views
0

時抑制STDERR我喜歡寫一些代碼,看起來像這樣:CSH - 用反引號

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.

是它可能會抑制此錯誤消息,但仍然管STDOUTwc?我經歷了對此的現有問題,但大多數答案要麼不在csh上工作,要麼嘗試將STDOUTSTDERR|&合併,這是我不想要的。

回答

0

最乾淨的方法本來是將ls本身靜音,但這是不可能的。
可以抑制你的整個腳本,意思是:
如果你的循環是在一個名爲myscript.cs文件,你打電話給你的文件與一些ARGS myscript.cs -arg1 blabla -arg2 bla,添加> &你的shell命令標準錯誤重定向到任何你想要的。例如
myscript.cs -arg1 blabla -arg2 bla >& /dev/null

它沒有直接回答您的答案,但它應該可以解決您的問題。

編輯
由於評論添加腳本應該被重定向到另一個腳本,您可以將行拆分兩行:如果`LS -1 $ {JOB_PREFIX} _ $ {

job_counter} _ *。出> &的/ dev/null`然後
而<您光顧這裏>

ENDIF

+0

不幸的是作爲腳本的輸出管道輸送到另一個腳本,併發送到日誌文件,所有這些屆時將有同樣的問題,這並不解決問題。我真的很喜歡能夠抑制'ls'的解決方案。 –

+0

看看http://stackoverflow.com/questions/42261228/csh-set-no-match-error-wildcard/42384620#42384620我在那裏回答了一個非常類似的問題 – user2141046

0

csh和tcsh無法單獨重定向標準錯誤,這是您不應將其用於腳本編寫的許多原因之一。

如果您能夠接受產卵另一個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 -lgrep -q .這樣我們就可以使用退出狀態,而不是標準錯誤的結果。

#!/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