2017-02-22 5 views
0

Je voudrais écrire un morceau de code qui ressemble à ceci:csh - supprimer STDERR lors de l'utilisation des accents graves

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

Mais chaque fois il n'y a pas ls -1 ${JOB_PREFIX}_${job_counter}*.csh il donne un ennuyeux ls: No match.

Est-il possible de supprimer ce message d'erreur mais encore pipe STDOUT à wc? Je suis allé à travers les questions existantes à ce sujet, mais la plupart des réponses ne travaillent pas sur csh ou tente de combiner STDOUT et STDERR avec |& dont je ne veux pas.

Répondre

0

Le moyen le plus propre aurait été de couper le ls lui-même, mais ce n'est pas possible.
Vous pouvez supprimer votre script entier, ce qui signifie:
Si vos boucles est dans un fichier appelé myscript.cs et que vous appelez votre fichier avec quelques args myscript.cs -arg1 blabla -arg2 bla, ajoutez> & à votre commande shell pour rediriger stderr à l'endroit où vous voulez. par exemple.
myscript.cs -arg1 blabla -arg2 bla >& /dev/null

Il ne répond pas directement à votre réponse, mais cela devrait résoudre votre problème.

Modifier
Depuis le commentaire a ajouté que le script doit être redirigé vers un autre script, vous pouvez diviser votre ligne à deux lignes:

si `ls -1 $ {} JOB_PREFIX _ $ { job_counter} _ *. out> &/dev/null` puis
pendant < votre temps ici>
fin
endif

+0

Malheureusement, cela ne résout pas le problème, car la sortie du script passe à un autre script et est également envoyée à un fichier journal, qui aura alors le même problème. J'aimerais vraiment une solution qui supprimerait 'ls' en vigueur. –

+0

jeter un oeil à http://stackoverflow.com/questions/42261228/csh-set-no-match-error-wildcard/42384620#42384620 J'ai répondu à une question très similaire – user2141046

0

csh et tcsh ne peuvent pas rediriger stderr par lui-même, une des nombreuses raisons pour lesquelles vous ne devriez pas l'utiliser pour les scripts.

Si vous êtes d'accord avec fraie une autre shell, vous pouvez changer JOB_COUNTER dans une variable d'environnement et à faire:

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

Si vous souhaitez utiliser un test comme condition dans une boucle while au lieu d'une expression , vous devez être créatif.

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

Dans votre cas, cela pourrait ressembler à quelque chose comme: J'ai changé le wc -l à un grep -q . afin que nous puissions utiliser l'état de sortie au lieu du résultat imprimé à 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