csh - foreach random no match -
this code:
set source_failed = `cat mine.log` set dest_failed = `cat their.log` foreach t ($source_failed) set isdiff = 0 set sflag = 0 foreach t2 ($dest_failed) if ($t2 == $t) set sflag = 1 break endif end ... end
problem inner foreach loop runs okay first few 10 iterations. after iteration, got
foreach: no match
moreover, iterating on array of strings, not files. reason behind error?
the problem (probably) mine.log
and/or their.log
contain special globbing characters, such *
or ?
. shell try expand file. there no matches accidental pattern, , hence error "no match".
the easiest way prevent behaviour add set noglob
top. tcsh(1)
:
noglob if set, filename substitution , directory stack substitution (q.v.) inhibited. useful in shell scripts not deal filenames, or after list of filenames has been obtained , further expansions not desirable.
you can re-enable behaviour using set glob
.
alternativly, can use :q
. tcsh(1)
:
unless enclosed in `"' or given `:q' modifier results of variable substitution may command , filename substituted. [..] when `:q' modifier applied substitution variable expand multiple words each word sepa rated blank , quoted prevent later command or filename sub stitution.
but need careful quoting when use variable. in below example, echo
command fail if don't add quotes (set noglob easier
):
set source_failed = `cat source` foreach t ($source_failed:q) echo "$t" end
Comments
Post a Comment