i trying run number of processes dynamically on fixed number of processors. want print output unique file each process there problem xargs not using in-place filename create separate file each process.
the bash script calls csh script , below:
$ cat temp | xargs -p 8 % csh '%'.csh >& '%'.log where temp text file of csh command names.
my problem xargs takes %.log literally , overwrites file processes write it, rather having seperate .log files desired.
i run script $ bash run.bash &
in general, using string replacement substitute code bad idea -- in case, if had script malicious name, name used run arbitrary commands. (sure, you're executing script, same apply in situations purely dealing data , output file names -- it's best make habit of robust approach regardless).
pass names as parameters script, rather substituting them into script (as xargs doing if fixed usage adding -i or -j parameters:
# best-practice approach: run fixed shell script, passing arguments on # command line. xargs -p 8 -n 1 \ sh -c 'for x; csh "${x}.csh" >"${x}.log" 2>&1; done' _ you'll note there's sh -c instance invoked: needed because xargs doesn't understand shell operations such redirections; if want redirection performed, need shell it.
now, let's go little more why original code behaved did:
xargs -p 8 % csh '%'.csh >& '%'.log ...first performs redirection %.log, then runs command
xargs -p 8 % csh '%'.csh there's no opportunity xargs replace %.log string, because redirection performed enclosing shell before xargs command run @ all.
Comments
Post a Comment