2017-02-22 9 views
0

使用しているときSTDERRを抑制:CSH - 私はこのようなコードのビット書きたいのですが、バッククォート

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

しかし、それは迷惑なls: No match.

を与える何ls -1 ${JOB_PREFIX}_${job_counter}*.cshがないたびにそれですこのエラーメッセージを抑制することができますが、まだパイプSTDOUTwcにパイプしますか?私はこれに関する既存の質問を調べましたが、ほとんどの回答はcshにはないか、とSTDERR|&と組み合わせることを嫌います。

答えて

0

最もきれいな方法は、ls自体をミュートすることでしたが、それはできません。あなたのループはmyscript.csというファイルにある場合
を、あなたが好きな場所に標準エラー出力をリダイレクトするために、あなたのシェルコマンドに> &を追加し、いくつかの引数myscript.cs -arg1 blabla -arg2 blaを使用してファイルを呼び出す:
あなたは意味、あなたのスクリプト全体を抑制することができます。例えば
myscript.cs -arg1 blabla -arg2 bla >& /dev/null

あなたの回答は直接回答していませんが、問題が解決するはずです。

編集
コメントは、スクリプトが別のスクリプトにリダイレクトされなければならないと付け加えたので、次の2つのラインにあなたの行を分割することができます: `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は、stderrを単独でリダイレクトできません。なぜなら、スクリプト作成に使用しないでください。

あなたが別のシェルを産卵して大丈夫なら、あなたは環境変数に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 

、これは次のようになります。私たちはstderrに出力結果ではなく、終了ステータスを使用できるように、私はgrep -q .wc -lを変更しました。スクリプトの出力は、別のスクリプトにパイプしても、同じ問題を抱えているだろうすべてがログファイルに送信よう

#!/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 
関連する問題