local fs = require("filesystem") local shell = require("shell") local sh = require("sh") local touch = loadfile(shell.resolve("touch", "lua")) local mkdir = loadfile(shell.resolve("mkdir", "lua")) if not touch then local errorMessage = "missing tools for mktmp" io.stderr:write(errorMessage .. '\n') return false, errorMessage end local args, ops = shell.parse(...) local function pop(...) local result for _,key in ipairs({...}) do result = ops[key] or result ops[key] = nil end return result end local directory = pop('d') local verbose = pop('v', 'verbose') local quiet = pop('q', 'quiet') if pop('help') or #args > 1 or next(ops) then print([[Usage: mktmp [OPTION] [PATH] Create a new file with a random name in $TMPDIR or PATH argument if given -d create a directory instead of a file -v, --verbose print result to stdout, even if no tty -q, --quiet do not print results to stdout, even if tty (verbose overrides) --help print this help message]]) if next(ops) then io.stderr:write("invalid option: " .. (next(ops)) .. '\n') return 1 end return end if not verbose then if not quiet then if io.stdout.tty then verbose = true end end end local prefix = args[1] or os.getenv("TMPDIR") .. '/' if not fs.exists(prefix) then io.stderr:write( string.format( "cannot create tmp file or directory at %s, it does not exist\n", prefix)) return 1 end local tmp = os.tmpname() local ok, reason = (directory and mkdir or touch)(tmp) if sh.internal.command_passed(ok) then if verbose then print(tmp) end return tmp end return ok, reason