Sometimes you need to create a temporary file in your shell script. There are various methods exist to create a random temporary file name. It is quite useful if your application/shell scripting needs temporary unique file names.
Fig.01: How create a temporary file in linux unix bash/ ksh /zsh shell script
Method # 1 Use of mktemp or tempfile utility
As the name suggest, both of the following commands create a unique temporary file or directory. Just type the mktemp at the shell prompt to create it a temp file or dir:
$ mktemp
Sample outputs
/tmp/tmp.Le4jmo6TrH
OR
$ tempfile
Sample outputs:
/tmp/file1wqzcO
Please note that the tempfile command is deprecated; you should use always use mktemp command instead. So to create a temp file:
tfile=$(mktemp /tmp/foo.XXXXXXXXX) echo "a file: $tfile"
To create a temp dir:
tdir=$(mktemp -d /tmp/foo.XXXXXXXXX) echo "a direcotry: $tdir"
How to make a directory
Make a unique temporary directory instead of a file using -d option. The syntax is:
$ mktemp -d
A shell script example
#!/bin/bash s="https://server1.cyberciti.biz/?Download=ips-v4&Format=text" f="$(mktemp /tmp/myscript.XXXXXX)" wget -q -O $f $s echo "IPv4 address downloaded to '$f'.." echo "Processing..." # # logic to do something on $f here # # Delete the temp file rm -f "$f"
Rest of the following methods are insecure and do not use them in production. They are here for historical reasons only.
Method #2: Use $RANDOM bash shell variable
At shell prompt type the command:
$ echo $RANDOM
Sample outputs:
13354
You can use it as follows:
file="/tmp/myscript.$RANDOM" echo "Working on temp $file ..." echo "Deleting $file ..." rm -f "$file"
Method # 3 Use of $$ variable
This is old and classic method. $$ shell variable returns the current running process this can be use to create unique temporary file as demonstrated in following script:
vi random2.bash
#!/bin/bash # TFILE="/tmp/$(basename $0).$$.tmp" ls > $TFILE echo "See directory listing in $TFILE"
Save the script and execute as follows:
$ chmod +x random2.bash
$ ./ random2.bash
Use this method if your script needs only ONE temporary file.
🐧 Get the latest tutorials on Linux, Open Source & DevOps via:
- RSS feed or Weekly email newsletter
- Share on Twitter • Facebook • 14 comments... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Suggest that you list the preferred method first rather than last.
mktemp /path/of/dorectory/filename.XXXXXX
The more X’s you add the more random characters it adds.
Great summary. Thank you.
It helps writing shell script!
After reading http://www.linuxsecurity.com/content/view/115462/151/ , I think some of your examples may be vulnerable to symlink attacks.
$RANDOM (once in the filename) or $$ alone are not enough because it may be possible for an attacker to create symlinks for all filenames.
This article is very useful: it helps me solve my problem. Thank you.
Hi
useful posts.
But i need to have filenames in sequence eachtime when i run the script in which i am creating the file.
This is very necro, but for others who find this rather high ranking search and want to create some “temp” files in sequence, you could do something like:
BASE=$(mktemp)
for a in {0..5}; do
cp $BASE $BASE.$a
done
That said, I really don’t understand why you’d care if they were in sequence.
Thank’s. Obrigado ! Very good tutorial !
$ tempfile -d
does not create a temporary directory. Instead, it requires a directory as an argument and creates a temporary file inside that directory.Artem,
Thanks for the heads up! The post has beeb updated.
createtempfiles.bash is missing… But article is still useful 🙂
Use logger command
how can i record the log in the log file in shell script?
like during running whatever the user is seeing, that should be recorded in log file.