Nuno J. Silva wrote:
> In a BASH script I'm writing, I need temporary files. Unfortunately, not
> only some of the used programs don't accept stdin nor stdout, but they
> also require "extensions" on the input/output file.

Yep.  A common problem.

> As I want to be sure nothing is overwritten, I tried calling mktemp with
> a modified template:
> 
> $ mktemp tmp.XXXXXXXXXX.ext
> mktemp: too few X's in template `tmp.XXXXXXXXXX.ext'

Beware that different mktemp implementations behave different.  Some
implementations will not produce an error but since the X's are not on
the right the filename produced will not be unique.

  $ mktemp /tmp/tmp.XXXXXXXXXX.ext
  /tmp/tmp.XXXXXXXXXX.ext
  $ ls -ldog /tmp/tmp.XXXXXXXXXX.ext
  -rw------- 1 0 2010-03-22 17:50 /tmp/tmp.XXXXXXXXXX.ext
  $ mktemp /tmp/tmp.XXXXXXXXXX.ext
  ...blocks trying to create a unique file...

Not what you want.

> Is this a limitation of mktemp (X's must be on the right)?

Yes.  It is a legacy limitation.  As Jim mentioned a feature for this
was recently added to GNU coreutils.

The traditional way to handle this problem was to create a temporary
directory and then create files with suffixes inside the directory.
Because the directory is uniquely named you can use a known name for
the file within the directory.

This is off of the top of my head, untested, I am not responsible for
any problems with it, and may contain a mistake and so forth but you
might try something like this example.  This is a do-nothing but with
enough to hopefully show you the technique.

  #!/bin/sh
  unset tmpdir
  trap 'cd / ; rm -rf $tmpdir' EXIT
  tmpdir=$(mktemp -d) || exit 1
  cd $tmpdir || exit 1
  echo foo > file1.ext
  sed 's/foo/bar/' file1.ext > file2.ext
  cat file2.ext
  ls -log
  exit 0

Bob


Reply via email to