2017-02-22 4 views
0

mit Ich möchte ein Stück Code zu schreiben, der wie folgt aussieht:csh - unterdrücken STDERR wenn Backticks

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

Aber jedes Mal gibt es keine ls -1 ${JOB_PREFIX}_${job_counter}*.csh es eine lästige ls: No match.

Ist es gibt möglich, diese Fehlermeldung zu unterdrücken, aber immer noch Rohr STDOUT zu wc? Ich ging durch die bestehenden Fragen zu diesem Thema, aber die meisten Antworten sind entweder nicht auf csh arbeiten oder versucht STDOUT und STDERR mit |& zu kombinieren, die ich nicht will.

Antwort

0

Der sauberste Weg wäre gewesen, die ls selbst stumm zu schalten, aber das ist nicht möglich.
Wenn Ihre Schleifen ist in einer Datei namens myscript.cs und rufen Sie Ihre Datei mit einigen args myscript.cs -arg1 blabla -arg2 bla, fügen> & zu Ihrem Shell-Befehl stderr zu umleiten, wo immer Sie wollen:
Sie können Ihre gesamte Skript, das heißt, zu unterdrücken. z.B.
myscript.cs -arg1 blabla -arg2 bla >& /dev/nullmyscript.cs -arg1 blabla -arg2 bla >& /dev/null

Es beantwortet Ihre Antwort nicht direkt, aber es sollte Ihr Problem lösen.

bearbeiten
Da der Kommentar hinzugefügt, dass das Skript zu einem anderen Skript umgeleitet werden soll, können Sie Ihre Linie auf zwei Linien aufgeteilt:

wenn `ls -1 $ {JOB_PREFIX} _ $ { job_counter} _ *. out> &/dev/null` dann
während < Ihre während hier>
Ende
endif

+0

Leider löst dies das Problem nicht, da die Ausgabe des Skripts an ein anderes Skript weitergeleitet und auch an eine Protokolldatei gesendet wird, die alle das gleiche Problem haben wird. Ich würde wirklich eine Lösung mögen, die 'ls' in der Wirkung unterdrücken würde. –

+0

werfen Sie einen Blick auf http://stackoverflow.com/questions/42261228/csh-set-no-match-error-wildcard/42384620#42384620 Ich antwortete dort auf eine sehr ähnliche Frage – user2141046

0

csh und tcsh können stderr nicht selbst umleiten, einer von vielen Gründen, den Sie nicht für das Scripting verwenden sollten.

Wenn Sie mit dem Laichen eine andere Shell in Ordnung sind, können Sie JOB_COUNTER in einer Umgebungsvariablen ändern und zu tun:

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

Wenn Sie einen Test als Bedingung in einer while Schleife anstelle eines Ausdrucks verwenden möchten Du musst kreativ werden.

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

In Ihrem Fall so etwas aussehen könnte: Ich habe die wc -l zu einem grep -q . geändert, so dass wir den Exit-Status anstelle des Ergebnisses zu stderr gedruckt verwenden können.