Recently I needed to write a shell script that updates itself, and, surprising, I found it an easy job to do. I will share the recipe here.
In my use case, I’m developing a kind of software updater and, before updating the system packages, I need to check if there is a new version of this software updater. If there is, then I update myself and run my new copy on-the-fly.
Enough talk, show me the code. I’ll paste here a simple shell script that talks by itself:
#!/bin/sh SCRIPT_NAME="$0" ARGS="$@" NEW_FILE="/tmp/blog.sh" VERSION="1.0" check_upgrade () { # check if there is a new version of this file # here, hypothetically we check if a file exists in the disk. # it could be an apt/yum check or whatever... [ -f "$NEW_FILE" ] && { # install a new version of this file or package # again, in this example, this is done by just copying the new file echo "Found a new version of me, updating myself..." cp "$NEW_FILE" "$SCRIPT_NAME" rm -f "$NEW_FILE" # note that at this point this file was overwritten in the disk # now run this very own file, in its new version! echo "Running the new version..." $SCRIPT_NAME $ARGS # now exit this old instance exit 0 } echo "I'm VERSION $VERSION, already the latest version." } main () { # main script stuff echo "Hello World! I'm the version $VERSION of the script" } check_upgrade main
To try this script:
1) save it somewhere
2) save a copy of it at /tmp/blog.sh (as pointed at line 5)
3) modify the variable “VERSION” (line 6) of that copy, to, say, “2.0″.
4) run the original script (not the one at /tmp)
You will see that the script updated itself and ran the “new” 2.0 version.
Try running again the original script (step 4 above). See the difference? It doesn’t update itself anymore, because it is the “latest” version.
A small thing you might notice: at line 19, I deleted the “new file”. That’s merely for this educational example, that we check if there’s a new version of the script by just checking if a file exists in the disk. On real life (with apt/yum or any smarter process) this is not needed as our check for a new version (line 13) will naturally fail.
This was tested with bash, dash and busybox’s ash. Worked fine.
I hope it’s useful to someone. Comments are welcome!
0sem comentários ainda